summaryrefslogtreecommitdiff
path: root/cpp/src/FreezeScript/TransformAnalyzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/FreezeScript/TransformAnalyzer.cpp')
-rw-r--r--cpp/src/FreezeScript/TransformAnalyzer.cpp99
1 files changed, 87 insertions, 12 deletions
diff --git a/cpp/src/FreezeScript/TransformAnalyzer.cpp b/cpp/src/FreezeScript/TransformAnalyzer.cpp
index abe87bead22..e198d526d36 100644
--- a/cpp/src/FreezeScript/TransformAnalyzer.cpp
+++ b/cpp/src/FreezeScript/TransformAnalyzer.cpp
@@ -158,8 +158,12 @@ FreezeScript::AnalyzeTransformVisitor::visitClassDefStart(const ClassDefPtr& v)
return false;
}
+ //
+ // Allow transforming from class to struct.
+ //
ClassDeclPtr decl = ClassDeclPtr::dynamicCast(l.front());
- if(!decl || decl->isInterface())
+ StructPtr newStruct = StructPtr::dynamicCast(l.front());
+ if(!newStruct && (!decl || decl->isInterface()))
{
if(!_ignoreTypeChanges)
{
@@ -168,20 +172,42 @@ FreezeScript::AnalyzeTransformVisitor::visitClassDefStart(const ClassDefPtr& v)
return false;
}
- ClassDefPtr newClass = decl->definition();
- if(!newClass)
+ ClassDefPtr newClass;
+ if(decl)
{
- _missingTypes.push_back(scoped);
- return false;
+ newClass = decl->definition();
+ if(!newClass)
+ {
+ _missingTypes.push_back(scoped);
+ return false;
+ }
+ }
+
+ DataMemberList oldMembers, newMembers;
+
+ if(newClass)
+ {
+ oldMembers = v->dataMembers();
+ newMembers = newClass->dataMembers();
+ }
+ else
+ {
+ oldMembers = v->allDataMembers();
+ newMembers = newStruct->dataMembers();
}
_out.newline();
_out.newline();
- _out << "<!-- class " << scoped << " -->";
+ if(newStruct)
+ {
+ _out << "<!-- struct " << scoped << " -->";
+ }
+ else
+ {
+ _out << "<!-- class " << scoped << " -->";
+ }
_out << se("transform") << attr("type", scoped);
- DataMemberList oldMembers = v->dataMembers();
- DataMemberList newMembers = newClass->dataMembers();
compareMembers(oldMembers, newMembers);
_out << ee;
@@ -210,8 +236,22 @@ FreezeScript::AnalyzeTransformVisitor::visitStructStart(const StructPtr& v)
return false;
}
+ //
+ // Allow transforming from struct to class.
+ //
StructPtr newStruct = StructPtr::dynamicCast(l.front());
- if(!newStruct)
+ ClassDeclPtr decl = ClassDeclPtr::dynamicCast(l.front());
+ ClassDefPtr newClass;
+ if(decl)
+ {
+ newClass = decl->definition();
+ if(!newClass)
+ {
+ _missingTypes.push_back(scoped);
+ return false;
+ }
+ }
+ else if(!newStruct)
{
if(!_ignoreTypeChanges)
{
@@ -222,11 +262,29 @@ FreezeScript::AnalyzeTransformVisitor::visitStructStart(const StructPtr& v)
_out.newline();
_out.newline();
- _out << "<!-- struct " << scoped << " -->";
+ if(newClass)
+ {
+ _out << "<!-- class " << scoped << " -->";
+ }
+ else
+ {
+ _out << "<!-- struct " << scoped << " -->";
+ }
_out << se("transform") << attr("type", scoped);
- DataMemberList oldMembers = v->dataMembers();
- DataMemberList newMembers = newStruct->dataMembers();
+ DataMemberList oldMembers, newMembers;
+
+ if(newClass)
+ {
+ oldMembers = v->dataMembers();
+ newMembers = newClass->allDataMembers();
+ }
+ else
+ {
+ oldMembers = v->dataMembers();
+ newMembers = newStruct->dataMembers();
+ }
+
compareMembers(oldMembers, newMembers);
_out << ee;
@@ -723,6 +781,14 @@ FreezeScript::AnalyzeTransformVisitor::compareTypes(const string& desc, const Ty
return;
}
+ //
+ // Allow target type of struct.
+ //
+ if(StructPtr::dynamicCast(newType))
+ {
+ return;
+ }
+
ClassDeclPtr newcl = ClassDeclPtr::dynamicCast(newType);
if(newcl)
{
@@ -751,6 +817,14 @@ FreezeScript::AnalyzeTransformVisitor::compareTypes(const string& desc, const Ty
return;
}
+ //
+ // Allow target type of class.
+ //
+ if(ClassDeclPtr::dynamicCast(newType))
+ {
+ return;
+ }
+
typeChange(desc, oldType, newType);
return;
}
@@ -1110,6 +1184,7 @@ FreezeScript::AnalyzeInitVisitor::typeChange(const TypePtr& t, const string& sco
ProxyPtr p = ProxyPtr::dynamicCast(t);
_out.newline();
+ _out.newline();
_out << "<!-- NOTICE: " << scoped << " has changed from ";
if(b)
{