@@ -77,27 +77,39 @@ export class LanguageMapping {
77
77
}
78
78
}
79
79
80
- function isASTNode ( classifier : Classifier ) {
81
- return ( classifier instanceof Concept ) &&
82
- ( classifier . key == ASTNode . key || ( classifier . extends && isASTNode ( classifier . extends ) ) ) ;
80
+ function isSpecialConcept ( classifier : Classifier ) {
81
+ return classifier . key == PositionClassifier . key ;
83
82
}
84
83
85
84
function importFeature ( feature : LWFeature ) : Feature | undefined {
86
85
const def : Feature = { name : feature . name } ;
87
86
if ( feature instanceof Containment ) {
88
- if ( feature . type && isASTNode ( feature . type ) ) {
87
+ if ( feature . type && feature . type instanceof Concept && ! isSpecialConcept ( feature . type ) ) {
89
88
def . child = true ;
90
89
def . multiple = feature . multiple ;
91
90
} else {
92
- // TODO we assume that:
93
- // 1) we're importing a StarLasu AST
94
- // 2) containments in a StarLasu AST are either AST nodes or internal StarLasu objects like the position
91
+ // TODO is it possible in Lionweb to have a Containment that's not a concept?
95
92
return undefined ;
96
93
}
97
94
}
98
95
return def
99
96
}
100
97
98
+ function importConcept ( concept : NodeDefinition | undefined , classifier : Classifier ) {
99
+ concept = {
100
+ name : classifier . name ,
101
+ features : { } ,
102
+ resolved : true
103
+ } ;
104
+ allFeatures ( classifier ) . forEach ( f => {
105
+ const feature = importFeature ( f ) ;
106
+ if ( feature ) {
107
+ concept ! . features [ f . name ] = feature ;
108
+ }
109
+ } ) ;
110
+ return concept ;
111
+ }
112
+
101
113
export class TylasuInstantiationFacade implements InstantiationFacade < TylasuWrapper > {
102
114
103
115
protected readonly concepts = new Map < Classifier , NodeDefinition > ( ) ;
@@ -128,17 +140,7 @@ export class TylasuInstantiationFacade implements InstantiationFacade<TylasuWrap
128
140
if ( ! node ) {
129
141
let concept = this . concepts . get ( classifier ) ;
130
142
if ( ! concept ) {
131
- concept = {
132
- name : classifier . name ,
133
- features : { } ,
134
- resolved : true
135
- } ;
136
- allFeatures ( classifier ) . forEach ( f => {
137
- const feature = importFeature ( f ) ;
138
- if ( feature ) {
139
- concept ! . features [ f . name ] = feature ;
140
- }
141
- } ) ;
143
+ concept = importConcept ( concept , classifier ) ;
142
144
this . concepts . set ( classifier , concept ) ;
143
145
}
144
146
node = new LionwebNode ( concept , {
0 commit comments