summaryrefslogtreecommitdiff
path: root/src/loadcolm.cc
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-06-06 11:15:28 -0400
committerAdrian Thurston <thurston@complang.org>2015-06-06 11:15:28 -0400
commit5a5cf0547b01d3c95dfa00b8f36f93a5143e25a7 (patch)
tree7406f2885b5fabb8b7e79a869ea64c0b1d17bf39 /src/loadcolm.cc
parent78ee9d0a8cc87c4d8cafae47b966e0bddf8d3021 (diff)
downloadcolm-5a5cf0547b01d3c95dfa00b8f36f93a5143e25a7.tar.gz
replacing list and map with vlist and vmap
Diffstat (limited to 'src/loadcolm.cc')
-rw-r--r--src/loadcolm.cc99
1 files changed, 74 insertions, 25 deletions
diff --git a/src/loadcolm.cc b/src/loadcolm.cc
index 0f4994ac..b62069a6 100644
--- a/src/loadcolm.cc
+++ b/src/loadcolm.cc
@@ -806,11 +806,6 @@ struct LoadColm
return qual;
}
- NamespaceQual *emptyNspaceQual()
- {
- return NamespaceQual::cons( curNspace() );
- }
-
RepeatType walkOptRepeat( opt_repeat OptRepeat )
{
RepeatType repeatType = RepeatNone;
@@ -828,8 +823,6 @@ struct LoadColm
return repeatType;
}
- BstSet<String, CmpStr> genericElDefined;
-
TypeRef *walkValueList( type_ref typeRef )
{
TypeRef *valType = walkTypeRef( typeRef._type_ref() );
@@ -847,6 +840,7 @@ struct LoadColm
ObjectField *elValObjField = ObjectField::cons( internal,
ObjectField::StructFieldType, valType, id );
structVarDef( internal, elValObjField );
+ elValObjField->context->listEl = true;
/* List El. */
listElDef( "el" );
@@ -859,6 +853,35 @@ struct LoadColm
return TypeRef::cons( typeRef.loc(), TypeRef::ValueList, 0, elType, valType );
}
+ TypeRef *walkListEl( type_ref typeRef )
+ {
+ TypeRef *valType = walkTypeRef( typeRef._type_ref() );
+
+ /* Create the value list element. */
+ String name( 32, "vlist_el_%s", valType->stringify().c_str() );
+
+ if ( !genericElDefined.find( name ) ) {
+ genericElDefined.insert( name );
+
+ structHead( internal, pd->rootNamespace, name, ObjectDef::StructType );
+
+ /* Var def. */
+ String id = "value";
+ ObjectField *elValObjField = ObjectField::cons( internal,
+ ObjectField::StructFieldType, valType, id );
+ structVarDef( internal, elValObjField );
+ elValObjField->context->listEl = true;
+
+ /* List El. */
+ listElDef( "el" );
+
+ structStack.pop();
+ namespaceStack.pop();
+ }
+
+ return TypeRef::cons( typeRef.loc(), emptyNspaceQual(), name );
+ }
+
TypeRef *walkValueMap( type_ref typeRef )
{
TypeRef *keyType = walkTypeRef( typeRef.KeyType() );
@@ -890,6 +913,35 @@ struct LoadColm
0, keyType, elType, valType );
}
+ TypeRef *walkMapEl( type_ref typeRef )
+ {
+ TypeRef *keyType = walkTypeRef( typeRef.KeyType() );
+ TypeRef *valType = walkTypeRef( typeRef.ValType() );
+
+ String name( 32, "vmap_el_%s_%s", keyType->stringify().c_str(),
+ valType->stringify().c_str() );
+
+ if ( !genericElDefined.find( name ) ) {
+ genericElDefined.insert( name );
+
+ structHead( internal, pd->rootNamespace, name, ObjectDef::StructType );
+
+ /* Var def. */
+ String id = "value";
+ ObjectField *elValObjField = ObjectField::cons( internal,
+ ObjectField::StructFieldType, valType, id );
+ structVarDef( internal, elValObjField );
+
+ /* Map El. */
+ mapElDef( "el", keyType );
+
+ structStack.pop();
+ namespaceStack.pop();
+ }
+
+ return TypeRef::cons( typeRef.loc(), emptyNspaceQual(), name );
+ }
+
TypeRef *walkTypeRef( type_ref typeRef )
{
TypeRef *tr = 0;
@@ -915,22 +967,19 @@ struct LoadColm
break;
}
case type_ref::List: {
- TypeRef *type = walkTypeRef( typeRef._type_ref() );
- tr = TypeRef::cons( typeRef.loc(), TypeRef::List, 0, type, 0 );
+ tr = walkValueList( typeRef );
break;
}
case type_ref::Map: {
- TypeRef *keyType = walkTypeRef( typeRef.KeyType() );
- TypeRef *elType = walkTypeRef( typeRef.ElType() );
- tr = TypeRef::cons( typeRef.loc(), TypeRef::Map, 0, keyType, elType );
+ tr = walkValueMap( typeRef );
break;
}
- case type_ref::ValueList: {
- tr = walkValueList( typeRef );
+ case type_ref::ListEl: {
+ tr = walkListEl( typeRef );
break;
}
- case type_ref::ValueMap: {
- tr = walkValueMap( typeRef );
+ case type_ref::MapEl: {
+ tr = walkMapEl( typeRef );
break;
}}
return tr;
@@ -2320,15 +2369,15 @@ struct LoadColm
case struct_item::Precedence:
walkPrecedenceDef( structItem.precedence_def() );
break;
- case struct_item::ListEl:
- listElDef( structItem.list_el_def().id().data() );
- break;
- case struct_item::MapEl: {
- map_el_def Def = structItem.map_el_def();
- TypeRef *keyTr = walkTypeRef( Def.type_ref() );
- mapElDef( Def.id().data(), keyTr );
- break;
- }
+// case struct_item::ListEl:
+// listElDef( structItem.list_el_def().id().data() );
+// break;
+// case struct_item::MapEl: {
+// map_el_def Def = structItem.map_el_def();
+// TypeRef *keyTr = walkTypeRef( Def.type_ref() );
+// mapElDef( Def.id().data(), keyTr );
+// break;
+// }
case struct_item::Alias:
walkAliasDef( structItem.alias_def() );
break;