@@ -42,6 +42,7 @@ import {KOLASU_URI_V1, THE_NODE_ECLASS as THE_NODE_ECLASS_V1} from "./kolasu-v1-
42
42
import { EBigDecimal , EBigInteger } from "./ecore-patching" ;
43
43
import { NodeAdapter } from "../trace/trace-node" ;
44
44
import { EClassifier } from "ecore" ;
45
+ import { PossiblyNamed , ReferenceByName } from "../model/naming" ;
45
46
46
47
export * as starlasu_v2 from "./starlasu-v2-metamodel" ;
47
48
export * as kolasu_v1 from "./kolasu-v1-metamodel" ;
@@ -518,7 +519,7 @@ export function loadEPackages(data: any, resource: ECore.Resource): ECore.EPacka
518
519
}
519
520
520
521
interface PostponedReference {
521
- eObject : ECore . EObject , feature : any , refValue : any
522
+ eObject : ECore . EObject , feature : any , refName : string | undefined , refValue : any
522
523
}
523
524
524
525
/**
@@ -530,19 +531,24 @@ class ReferencesTracker {
530
531
constructor ( public resource : ECore . Resource ) {
531
532
}
532
533
533
- trackReference ( eObject : ECore . EObject , feature : any , refValue : any ) : void {
534
- this . postponedReferences . push ( { eObject, feature, refValue} ) ;
534
+ trackReference ( eObject : ECore . EObject , feature : any , refName : string | undefined , refValue : any ) : void {
535
+ this . postponedReferences . push ( { eObject, feature, refName : refName , refValue} ) ;
535
536
}
536
537
537
538
resolveAllReferences ( ) : void {
538
- this . postponedReferences . forEach ( ( pr ) => {
539
+ this . postponedReferences . forEach ( ( pr ) => {
539
540
this . resolveReference ( pr ) ;
540
541
} ) ;
541
542
this . postponedReferences = [ ] ;
542
543
}
543
544
544
545
resolveReference ( pr : PostponedReference ) {
545
- if ( pr . feature . get ( 'upperBound' ) !== 1 ) {
546
+ if ( pr . refName ) {
547
+ pr . eObject . set ( pr . feature , THE_REFERENCE_BY_NAME_ECLASS . create ( {
548
+ name : pr . refName ,
549
+ referenced : pr . refValue ? this . getReferredObject ( pr . refValue [ "$ref" ] ) : undefined
550
+ } ) ) ;
551
+ } else if ( pr . feature . get ( 'upperBound' ) !== 1 ) {
546
552
const list = pr . eObject . get ( pr . feature ) ;
547
553
pr . refValue . forEach ( ref => {
548
554
list . add ( this . getReferredObject ( ref . $ref ) ) ;
@@ -770,20 +776,15 @@ function importJsonObject(
770
776
if ( eGenericType ) {
771
777
eType = eGenericType . get ( "eClassifier" ) ;
772
778
if ( eType == THE_REFERENCE_BY_NAME_ECLASS ) {
773
- //eType = eGenericType.get("eTypeArguments").at(0).get("eClassifier");
774
- const refValue = obj [ key ] . referenced ;
775
- if ( refValue ) {
776
- referencesTracker . trackReference ( eObject , feature , refValue ) ;
777
- }
779
+ referencesTracker . trackReference ( eObject , feature , obj [ key ] . name , obj [ key ] . referenced ) ;
778
780
continue ;
779
781
}
780
782
}
781
783
}
782
784
if ( feature . get ( "containment" ) === true ) {
783
785
setChild ( feature , obj , key , eObject , resource , eType , strict , referencesTracker , eClass ) ;
784
786
} else if ( feature . isKindOf ( ECore . EReference ) ) {
785
- const refValue = obj [ key ] ;
786
- referencesTracker . trackReference ( eObject , feature , refValue ) ;
787
+ referencesTracker . trackReference ( eObject , feature , undefined , obj [ key ] ) ;
787
788
} else {
788
789
throw featureError ( "The feature is neither a containment nor a reference" , key , eClass , resource ) ;
789
790
}
@@ -824,7 +825,7 @@ export interface EcoreMetamodelSupport {
824
825
generateMetamodel ( resource : ECore . Resource , includingKolasuMetamodel : boolean ) : void ;
825
826
}
826
827
827
- export class ECoreNode extends NodeAdapter {
828
+ export class ECoreNode extends NodeAdapter implements PossiblyNamed {
828
829
829
830
parent ?: ECoreNode ;
830
831
@@ -838,6 +839,10 @@ export class ECoreNode extends NodeAdapter {
838
839
}
839
840
}
840
841
842
+ get name ( ) : string | undefined {
843
+ return this . getAttributeValue ( "name" ) ;
844
+ }
845
+
841
846
private _nodeDefinition ?: NodeDefinition ;
842
847
843
848
get nodeDefinition ( ) {
@@ -863,7 +868,7 @@ export class ECoreNode extends NodeAdapter {
863
868
}
864
869
}
865
870
866
- getAttribute ( name : string ) : any {
871
+ getAttributeValue ( name : string ) : any {
867
872
return this . eo . get ( name ) ;
868
873
}
869
874
@@ -885,6 +890,36 @@ export class ECoreNode extends NodeAdapter {
885
890
return this . _children ! . filter ( c => ! role || c . getRole ( ) == role ) ;
886
891
}
887
892
893
+ protected doGetChildOrChildren ( name : string | symbol ) : ECoreNode | ECoreNode [ ] | undefined {
894
+ const containment = this . containment ( name ) ;
895
+ const children = this . getChildren ( name . toString ( ) ) ;
896
+ if ( ! containment ?. multiple ) {
897
+ if ( children ) {
898
+ return children [ 0 ] ;
899
+ } else {
900
+ return undefined ;
901
+ }
902
+ } else {
903
+ return children ;
904
+ }
905
+ }
906
+
907
+ getReference ( name : string | symbol ) : ReferenceByName < ECoreNode > | undefined {
908
+ const ref = this . eo . get ( name . toString ( ) ) ;
909
+ if ( ref ) {
910
+ if ( ref . isKindOf ( THE_REFERENCE_BY_NAME_ECLASS ) ) {
911
+ const referred = ref . get ( "referenced" ) ;
912
+ return new ReferenceByName < any > ( ref . get ( "name" ) , referred ? new ECoreNode ( referred ) : undefined ) ;
913
+ } else {
914
+ const error = new Error ( `Not a reference: ${ name . toString ( ) } ` ) as any ;
915
+ error . object = ref ;
916
+ throw error ;
917
+ }
918
+ } else {
919
+ return undefined ;
920
+ }
921
+ }
922
+
888
923
getId ( ) : string {
889
924
return this . eo . fragment ( ) ;
890
925
}
0 commit comments