@@ -603,12 +603,13 @@ algorithm
603603 list< NFSCodeEnv . Extends > exts;
604604 Globals globals;
605605 Env env;
606+ Modifier orig_mod;
606607
607608 case (elem :: rest_el, _, exts, _, _, _, accum_el, cse, globals)
608609 equation
609- (elem, env, _) = resolveRedeclaredElement(elem, inEnv);
610- (accum_el, exts, cse, globals) = instElement_dispatch(elem, inPrefixes, exts ,
611- env, inPrefix, inInstPolicy, accum_el, cse, globals);
610+ (elem, orig_mod, env, _) = resolveRedeclaredElement(elem, inEnv, inPrefix );
611+ (accum_el, exts, cse, globals) = instElement_dispatch(elem, orig_mod ,
612+ inPrefixes, exts, env, inPrefix, inInstPolicy, accum_el, cse, globals);
612613 (accum_el, cse, globals) = instElementList2(rest_el, inPrefixes, exts,
613614 inEnv, inPrefix, inInstPolicy, accum_el, cse, globals);
614615 then
@@ -638,43 +639,75 @@ public function resolveRedeclaredElement
638639 be instantiated is returned, otherwise the old environment."
639640 input tuple< SCode . Element , Modifier > inElement;
640641 input Env inEnv;
642+ input Prefix inPrefix;
641643 output tuple< SCode . Element , Modifier > outElement;
644+ output Modifier outOriginalMod;
642645 output Env outEnv;
643646 output list< tuple< NFSCodeEnv . Item , Env >> outPreviousItem;
644647algorithm
645- (outElement, outEnv, outPreviousItem) := match(inElement, inEnv)
648+ (outElement, outOriginalMod, outEnv, outPreviousItem) := match(inElement, inEnv, inPrefix )
646649 local
647- Modifier mod;
650+ Modifier mod, omod ;
648651 String name;
649652 Item item;
650- SCode . Element el ;
653+ SCode . Element orig_el, new_el ;
651654 Env env;
652655 Boolean b;
653656 list< tuple< NFSCodeEnv . Item , Env >> previousItem;
654657
655658 // Only components which are actually replaceable needs to be looked up,
656659 // since non-replaceable components can't have been replaced.
657- case ((SCode . COMPONENT (name = name, prefixes =
658- SCode . PREFIXES (replaceablePrefix = SCode . REPLACEABLE (_))), mod), _)
660+ case ((orig_el as SCode . COMPONENT (name = name, prefixes =
661+ SCode . PREFIXES (replaceablePrefix = SCode . REPLACEABLE (_))), mod), _, _ )
659662 equation
660663 (item, _) = NFSCodeLookup . lookupInClass(name, inEnv);
661- (NFSCodeEnv . VAR (var = el), env, previousItem) = NFSCodeEnv . resolveRedeclaredItem(item, inEnv);
664+ (NFSCodeEnv . VAR (var = new_el), env, previousItem) = NFSCodeEnv . resolveRedeclaredItem(item, inEnv);
665+ omod = getOriginalMod(orig_el, inEnv, inPrefix);
662666 then
663- ((el , mod), env, previousItem);
667+ ((new_el , mod), omod , env, previousItem);
664668
665669 // Other elements doesn't need to be looked up. Extends may not be
666670 // replaceable, and classes are looked up in the environment anyway. The
667671 // exception is packages with constants, but those are handled in
668672 // instPackageConstants.
669- else (inElement, inEnv, {});
673+ else (inElement, NFInstTypes . NOMOD (), inEnv, {});
670674
671675 end match;
672676end resolveRedeclaredElement;
673677
678+ protected function getOriginalMod
679+ input SCode . Element inOriginalElement;
680+ input Env inEnv;
681+ input Prefix inPrefix;
682+ output Modifier outModifier;
683+ algorithm
684+ outModifier := match(inOriginalElement, inEnv, inPrefix)
685+ local
686+ SCode . Ident name;
687+ Absyn . ArrayDim ad;
688+ Integer dim_count;
689+ SCode . Mod smod;
690+ Modifier mod;
691+
692+ case (SCode . COMPONENT (modifications = SCode . NOMOD ()), _, _)
693+ then NFInstTypes . NOMOD ();
694+
695+ case (SCode . COMPONENT (name = name, attributes = SCode . ATTR (arrayDims = ad),
696+ modifications = smod), _, _)
697+ equation
698+ dim_count = listLength(ad);
699+ mod = NFSCodeMod . translateMod(smod, name, dim_count, inPrefix, inEnv);
700+ then
701+ mod;
702+
703+ end match;
704+ end getOriginalMod;
705+
674706protected function instElement_dispatch
675707 "Helper function to instElementList2. Dispatches the given element to the
676708 correct function for instantiation."
677709 input tuple< SCode . Element , Modifier > inElement;
710+ input Modifier inOriginalMod;
678711 input Prefixes inPrefixes;
679712 input list< NFSCodeEnv . Extends > inExtends;
680713 input Env inEnv;
@@ -689,8 +722,8 @@ protected function instElement_dispatch
689722 output Globals outGlobals;
690723algorithm
691724 (outElements, outExtends, outContainsSpecialExtends, outGlobals) :=
692- match(inElement, inPrefixes, inExtends, inEnv, inPrefix, inInstPolicy ,
693- inAccumEl, inContainsSpecialExtends, inGlobals)
725+ match(inElement, inOriginalMod, inPrefixes, inExtends, inEnv, inPrefix,
726+ inInstPolicy, inAccumEl, inContainsSpecialExtends, inGlobals)
694727 local
695728 SCode . Element elem;
696729 Modifier mod;
@@ -709,23 +742,25 @@ algorithm
709742 Item item;
710743
711744 // A component when we're in 'instantiate everything'-mode.
712- case ((elem as SCode . COMPONENT (name = _), mod), _, _, _, _, INST_ALL (), _, cse, globals)
745+ case ((elem as SCode . COMPONENT (name = _), mod), _, _, _, _, _, INST_ALL (), _, cse, globals)
713746 equation
714- (res, globals) = instElement(elem, mod, inPrefixes, inEnv, inPrefix, inInstPolicy, globals);
747+ (res, globals) = instElement(elem, mod, inOriginalMod, inPrefixes,
748+ inEnv, inPrefix, inInstPolicy, globals);
715749 then
716750 (res :: inAccumEl, inExtends, cse, globals);
717751
718752 // A constant when we're on 'instantiate only constants'-mode.
719753 case ((elem as SCode . COMPONENT (attributes = SCode . ATTR (variability =
720- SCode . CONST ())), mod), _, _, _, _, INST_ONLY_CONST (), _, cse, globals)
754+ SCode . CONST ())), mod), _, _, _, _, _, INST_ONLY_CONST (), _, cse, globals)
721755 equation
722- (res, globals) = instElement(elem, mod, inPrefixes, inEnv, inPrefix, inInstPolicy, globals);
756+ (res, globals) = instElement(elem, mod, inOriginalMod, inPrefixes,
757+ inEnv, inPrefix, inInstPolicy, globals);
723758 then
724759 (res :: inAccumEl, inExtends, cse, globals);
725760
726761 // An extends clause. Instantiate it together with the next Extends element
727762 // from the environment.
728- case ((elem as SCode . EXTENDS (baseClassPath = _), mod), _,
763+ case ((elem as SCode . EXTENDS (baseClassPath = _), mod), _, _,
729764 NFSCodeEnv . EXTENDS (redeclareModifiers = redecls) :: rest_exts, _, _, ip, _, _, globals)
730765 equation
731766 (res, cse, globals) = instExtends(elem, mod, inPrefixes, redecls,
@@ -736,7 +771,7 @@ algorithm
736771
737772 // A package, instantiate only the constants.
738773 case ((elem as SCode . CLASS (name = name, restriction = SCode . R_PACKAGE ()),
739- mod), _, _, _, _, ip, _, cse, globals)
774+ mod), _, _, _, _, _, ip, _, cse, globals)
740775 equation
741776 (ores, globals) = instPackageConstants(elem, mod, inEnv, inPrefix, globals);
742777 accum_el = List . consOption(ores, inAccumEl);
@@ -746,7 +781,7 @@ algorithm
746781 // We should have one Extends element for each extends clause in the class.
747782 // If we get an extends clause but don't have any Extends elements left,
748783 // something has gone very wrong.
749- case ((SCode . EXTENDS (baseClassPath = _), _), _, {}, _, _, _, _, _, _)
784+ case ((SCode . EXTENDS (baseClassPath = _), _), _, _, {}, _, _, _, _, _, _)
750785 equation
751786 Error . addMessage(Error . INTERNAL_ERROR ,
752787 {"NFSCodeInst.instElement_dispatch ran out of extends!." });
@@ -762,6 +797,7 @@ end instElement_dispatch;
762797protected function instElement
763798 input SCode . Element inElement;
764799 input Modifier inClassMod;
800+ input Modifier inOriginalMod;
765801 input Prefixes inPrefixes;
766802 input Env inEnv;
767803 input Prefix inPrefix;
@@ -770,8 +806,8 @@ protected function instElement
770806 output Element outElement;
771807 output Globals outGlobals;
772808algorithm
773- (outElement,outGlobals) :=
774- match(inElement, inClassMod, inPrefixes, inEnv, inPrefix, inInstPolicy, inGlobals)
809+ (outElement, outGlobals) := match(inElement, inClassMod, inOriginalMod,
810+ inPrefixes, inEnv, inPrefix, inInstPolicy, inGlobals)
775811 local
776812 Absyn . ArrayDim ad;
777813 Absyn . Info info;
@@ -800,7 +836,7 @@ algorithm
800836 // an outer component
801837 case (SCode . COMPONENT (name = name,
802838 typeSpec = Absyn . TPATH (path = tpath),
803- prefixes = SCode . PREFIXES (innerOuter = Absyn . OUTER ())), _, _, _, _, _, globals)
839+ prefixes = SCode . PREFIXES (innerOuter = Absyn . OUTER ())), _, _, _, _, _, _, globals)
804840 equation
805841 prefix = NFInstUtil . addPrefix(name, {}, inPrefix);
806842 path = NFInstUtil . prefixToPath(prefix);
@@ -810,7 +846,7 @@ algorithm
810846
811847 case (SCode . COMPONENT (name = name, typeSpec = Absyn . TPATH (path =
812848 Absyn . QUALIFIED (name = "$EnumType" , path = tpath)), info = info),
813- _, _, _, _, ip, globals)
849+ _, _, _, _, _, ip, globals)
814850 equation
815851 Absyn . QUALIFIED (name = enum_idx_str, path = tpath) = tpath;
816852 enum_idx = stringInt(enum_idx_str);
@@ -829,7 +865,7 @@ algorithm
829865 // A component, look up it's type and instantiate that class.
830866 case (SCode . COMPONENT (name = name, attributes = SCode . ATTR (arrayDims = ad),
831867 typeSpec = Absyn . TPATH (path = tpath), modifications = smod,
832- condition = NONE (), info = info), _, _, _, _, ip, globals)
868+ condition = NONE (), info = info), _, _, _, _, _, ip, globals)
833869 equation
834870 // Look up the class of the component.
835871 (item, _, env) = NFSCodeLookup . lookupClassName(tpath, inEnv, info);
@@ -846,6 +882,7 @@ algorithm
846882 // Merge the class modifications with this element's modifications.
847883 dim_count = listLength(ad);
848884 mod = NFSCodeMod . translateMod(smod, name, dim_count, inPrefix, inEnv);
885+ mod = NFSCodeMod . mergeMod(inOriginalMod, mod);
849886 cmod = NFSCodeMod . propagateMod(inClassMod, dim_count);
850887 mod = NFSCodeMod . mergeMod(cmod, mod);
851888
@@ -879,7 +916,7 @@ algorithm
879916
880917 // A conditional component, save it for later.
881918 case (SCode . COMPONENT (name = name, condition = SOME (cond_exp), info = info),
882- _, _, _, _, _, globals)
919+ _, _, _, _, _, _, globals)
883920 equation
884921 path = NFInstUtil . prefixPath(Absyn . IDENT (name), inPrefix);
885922 (inst_exp, globals) = instExp(cond_exp, inEnv, inPrefix, info, globals);
@@ -2297,7 +2334,7 @@ algorithm
22972334 (NFSCodeEnv . VAR (var = selem), env, _) = NFSCodeEnv . resolveRedeclaredItem(item, env);
22982335
22992336 prefix = NFInstUtil . restPrefix(NFInstUtil . pathPrefix(inName));
2300- (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (),
2337+ (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (), NFInstTypes . NOMOD (),
23012338 NFInstTypes . NO_PREFIXES (), env, prefix, INST_ALL (), inGlobals);
23022339
23032340 consts = NFInstSymbolTable . addElement(elem, consts);
@@ -2413,7 +2450,7 @@ algorithm
24132450 case (_, NFSCodeEnv . VAR (var = selem as SCode . COMPONENT (typeSpec =
24142451 Absyn . TPATH (path = Absyn . QUALIFIED (name = "$EnumType" )))), env, _, _)
24152452 equation
2416- (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (),
2453+ (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (), NFInstTypes . NOMOD (),
24172454 NFInstTypes . NO_PREFIXES (), env, inPrefix, INST_ALL (), inGlobals);
24182455 consts = NFInstSymbolTable . addElement(elem, consts);
24192456 then
@@ -2422,7 +2459,7 @@ algorithm
24222459 // A normal package constant.
24232460 case (_, NFSCodeEnv . VAR (var = selem), env, _, _)
24242461 equation
2425- (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (),
2462+ (elem, (consts, funcs)) = instElement(selem, NFInstTypes . NOMOD (), NFInstTypes . NOMOD (),
24262463 NFInstTypes . NO_PREFIXES (), env, inPrefix, INST_ALL (), inGlobals);
24272464
24282465 NFInstTypes . ELEMENT (component = comp) = elem;
@@ -3944,7 +3981,7 @@ algorithm
39443981 // instElement will just add it as a conditional component again.
39453982 sel = SCode . removeComponentCondition(inElement);
39463983 // Instantiate the element and update the symbol table.
3947- (el, globals) = instElement(sel, inMod, inPrefixes, inEnv, inPrefix, INST_ALL (), globals);
3984+ (el, globals) = instElement(sel, inMod, NFInstTypes . NOMOD (), inPrefixes, inEnv, inPrefix, INST_ALL (), globals);
39483985 (st, added) = NFInstSymbolTable . addInstCondElement(el, st);
39493986 // Recursively instantiate any conditional components in this element.
39503987 (oel, st, globals) = instConditionalElementOnTrue(added, el, st, globals);
0 commit comments