From 69ce093f7d0480fe0cde08c26e76d0ea033fced6 Mon Sep 17 00:00:00 2001 From: Shikib Mehri Date: Sun, 31 Jan 2016 19:05:13 -0800 Subject: [PATCH 1/5] fixed issue 686 by adding handling of methods obtaiend from extended classes and interfaces. moved code injection validity check to take place after all tokens have been parsed --- .../src/UmpleInternalParser_CodeClass.ump | 84 +++++++++++++------ cruise.umple/src/Umple_Code.ump | 38 +++++++++ 2 files changed, 96 insertions(+), 26 deletions(-) diff --git a/cruise.umple/src/UmpleInternalParser_CodeClass.ump b/cruise.umple/src/UmpleInternalParser_CodeClass.ump index c8131b117d..5860af0a4e 100644 --- a/cruise.umple/src/UmpleInternalParser_CodeClass.ump +++ b/cruise.umple/src/UmpleInternalParser_CodeClass.ump @@ -376,6 +376,18 @@ class UmpleInternalParser } } + //Issue 686 + private void checkCodeInjections() + { + for(UmpleClass uClass : model.getUmpleClasses()) + { + for(CodeInjection injection : uClass.getCodeInjections()) + { + checkCodeInjectionValidity(injection, uClass); + } + } + } + public void analyzeInvariants() { for(UmpleClassifier uClass:unanalyzedInvariants.keySet()) @@ -1178,10 +1190,10 @@ class UmpleInternalParser { for (AssociationVariable av : unlinkedAssociationVariables) { - + UmpleClass aClass = model.getUmpleClass(av.getType()); UmpleClass bClass = model.getUmpleClass(av.getRelatedAssociation().getType()); - + if (aClass == null || bClass == null){ //Association is between Class and Interface continue; } @@ -1189,6 +1201,7 @@ class UmpleInternalParser Association assoc = bClass.getAssociation(bClass.indexOfAssociationVariable(av)); boolean added = aClass.addAssociationVariable(av.getRelatedAssociation()); + if (!added) { if ((!aClass.isImmutable() && !av.getRelatedAssociation().getIsNavigable()) || (!bClass.isImmutable() && !av.getIsNavigable())) @@ -2554,50 +2567,69 @@ class UmpleInternalParser makeCodeInject(injectToken,injection,cb,uClassifier); injection.setSnippet(cb); if (uClassifier instanceof UmpleClass) { - checkCodeInjectionValidity(injectToken, operationName.toString(), uClassifier); + //checkCodeInjectionValidity(injectToken, operationName.toString(), uClassifier); ((UmpleClass)uClassifier).addCodeInjection(injection); } else if (uClassifier instanceof UmpleTrait){ ((UmpleTrait)uClassifier).addCodeInjection(injection); } } - private boolean checkCodeInjectionValidity(Token injectToken, String operationName, UmpleClassifier uClassifier) { - for(String operation : operationName.split(",")) + private boolean checkCodeInjectionValidity(CodeInjection injection, UmpleClass uClass) { + ArrayList methodNames = new ArrayList(); + String operationName = injection.getOperation(); + + ArrayList todoExtendedClasses = new ArrayList(); + ArrayList todoInheritedInterfaces = new ArrayList(); + + todoExtendedClasses.add(uClass.getName()); + while(!todoExtendedClasses.isEmpty()) { - Boolean matches = false; - UmpleClass uClass = (UmpleClass) uClassifier; + String className = todoExtendedClasses.get(0); + todoExtendedClasses.remove(className); - ArrayList methodNames = new ArrayList(); - for(Method aMethod : uClass.getMethods()) + UmpleClass eClass = model.getUmpleClass(className); + + if(eClass == null) { - methodNames.add(aMethod.getName()); + todoInheritedInterfaces.add(className); + continue; } - for(Attribute attr : uClass.getAttributes()) + todoExtendedClasses.remove(className); + if(unlinkedExtends.get(eClass) != null) { - methodNames.addAll(attr.getMethodNames()); + todoExtendedClasses.addAll(unlinkedExtends.get(eClass)); } - for(AssociationVariable av : uClass.getAssociationVariables()) + methodNames.addAll(eClass.getMethodNames()); + } + + while(!todoInheritedInterfaces.isEmpty()) + { + String interfaceName = todoInheritedInterfaces.get(0); + todoInheritedInterfaces.remove(interfaceName); + + UmpleInterface eInterface = model.getUmpleInterface(interfaceName); + + if(eInterface == null) { - methodNames.addAll(av.getMethodNames()); + continue; } - for(StateMachine sm : uClass.getStateMachines()) + if(unlinkedInterfaceExtends.get(eInterface) != null) { - String stateMachineName = sm.getName().substring(0, 1).toUpperCase() + sm.getName().substring(1); - methodNames.add("set" + stateMachineName); - methodNames.add("get" + stateMachineName); + todoInheritedInterfaces.addAll(unlinkedInterfaceExtends.get(eInterface)); + } - for(Event ev : sm.getEvents()) - { - methodNames.add(ev.getName()); - } + for(Method m : eInterface.getMethods()) + { + methodNames.add(m.getName()); } + } - methodNames.add("constructor"); - methodNames.add("delete"); - methodNames.add("toString"); + for(String operation : operationName.split(",")) + { + Boolean matches = false; for(String methodName : methodNames) { @@ -2607,7 +2639,7 @@ class UmpleInternalParser } if(!matches) { - getParseResult().addErrorMessage(new ErrorMessage(1012, injectToken.getPosition(), operation)); + getParseResult().addErrorMessage(new ErrorMessage(1012, injection.getPosition(), operation)); } } diff --git a/cruise.umple/src/Umple_Code.ump b/cruise.umple/src/Umple_Code.ump index c7df34b392..72552ffac1 100644 --- a/cruise.umple/src/Umple_Code.ump +++ b/cruise.umple/src/Umple_Code.ump @@ -1178,6 +1178,43 @@ class UmpleClass return all; } + public ArrayList getMethodNames() + { + ArrayList methodNames = new ArrayList(); + for(Method aMethod : this.getMethods()) + { + methodNames.add(aMethod.getName()); + } + + for(Attribute attr : this.getAttributes()) + { + methodNames.addAll(attr.getMethodNames()); + } + + for(AssociationVariable av : this.getAssociationVariables()) + { + methodNames.addAll(av.getMethodNames()); + } + + for(StateMachine sm : this.getStateMachines()) + { + String stateMachineName = sm.getName().substring(0, 1).toUpperCase() + sm.getName().substring(1); + methodNames.add("set" + stateMachineName); + methodNames.add("get" + stateMachineName); + + for(Event ev : sm.getEvents()) + { + methodNames.add(ev.getName()); + } + } + + methodNames.add("constructor"); + methodNames.add("delete"); + methodNames.add("toString"); + + return methodNames; + } + public Boolean matchOperationMethod(String fullOperation, String method) { String formattedMethod = StringFormatter.toUnderscore(method); TriState isMatch = new TriState(false); @@ -3021,6 +3058,7 @@ class AssociationVariable { ArrayList methodNames = new ArrayList(); String attributeCapitalizedName = this.getUpperCaseName(); + String singularName = getUmpleClass().getSourceModel().getGlossary().getSingular(this.getName()); String singularCapitalizedName = singularName.substring(0, 1).toUpperCase() + singularName.substring(1); From cf4f694672367564c27a1987435d3d90a870a940 Mon Sep 17 00:00:00 2001 From: Shikib Mehri Date: Sun, 31 Jan 2016 22:21:05 -0800 Subject: [PATCH 2/5] added more unit tests and fixed issues with tests on eclipse --- .../src/UmpleInternalParser_CodeClass.ump | 3 + cruise.umple/src/Umple_Code.ump | 5 + .../cruise/umple/compiler/UmpleClassTest.java | 155 ++++++++++++++---- 3 files changed, 129 insertions(+), 34 deletions(-) diff --git a/cruise.umple/src/UmpleInternalParser_CodeClass.ump b/cruise.umple/src/UmpleInternalParser_CodeClass.ump index 8abc87c7db..703a2a9927 100644 --- a/cruise.umple/src/UmpleInternalParser_CodeClass.ump +++ b/cruise.umple/src/UmpleInternalParser_CodeClass.ump @@ -373,6 +373,9 @@ class UmpleInternalParser checkNonReachableStates(); //Issue 610 checkAssociationClassKeys(); + + //Issue 686 + checkCodeInjections(); } } diff --git a/cruise.umple/src/Umple_Code.ump b/cruise.umple/src/Umple_Code.ump index 8f1955fd08..5894051e15 100644 --- a/cruise.umple/src/Umple_Code.ump +++ b/cruise.umple/src/Umple_Code.ump @@ -3120,6 +3120,11 @@ class AssociationVariable public ArrayList getMethodNames() { + if(!getIsNavigable()) + { + return new ArrayList(); + } + ArrayList methodNames = new ArrayList(); String attributeCapitalizedName = this.getUpperCaseName(); diff --git a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java index d5bfd8da1e..73240d94a0 100644 --- a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java +++ b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java @@ -150,6 +150,7 @@ public void getLazyAttributeMethods() Assert.assertEquals(methods.size(),2); } + @Test public void getAutouniqueAttributeMethods() { Attribute a = new Attribute("a",null,"autounique",null,false,umpleClass); @@ -159,6 +160,7 @@ public void getAutouniqueAttributeMethods() Assert.assertEquals(methods.size(),2); } + @Test public void getDefaultedAttributeMethods() { Attribute a = new Attribute("a",null,"defaulted",null,false,umpleClass); @@ -169,6 +171,34 @@ public void getDefaultedAttributeMethods() Assert.assertTrue(methods.contains("getDefaultA")); Assert.assertEquals(methods.size(),4); } + + @Test + public void getSingularAssociationMethods() + { + AssociationVariable av = new AssociationVariable("a","A",null,null,createMultiplicity(0,1),true); + ArrayList methods = av.getMethodNames(); + Assert.assertTrue(methods.contains("setA")); + Assert.assertTrue(methods.contains("getA")); + Assert.assertEquals(methods.size(),2); + } + + @Test + public void getMultipleAssociationMethods() + { + AssociationVariable av = new AssociationVariable("as","A",null,null,createMultiplicity(0,-1),true); + ArrayList methods = av.getMethodNames(); + Assert.assertTrue(methods.contains("getA")); + Assert.assertTrue(methods.contains("getAs")); + Assert.assertTrue(methods.contains("numberOfAs")); + Assert.assertTrue(methods.contains("hasA")); + Assert.assertTrue(methods.contains("indexOfA")); + Assert.assertTrue(methods.contains("minimumNumberOfAs")); + Assert.assertTrue(methods.contains("addA")); + Assert.assertTrue(methods.contains("addAAt")); + Assert.assertTrue(methods.contains("addOrMoveAAt")); + Assert.assertTrue(methods.contains("removeoveA")); + Assert.assertEquals(methods.size(),10); + } @Test public void makeSingleton_AddingOfStaticVariable() throws UmpleCompilerException @@ -178,7 +208,6 @@ public void makeSingleton_AddingOfStaticVariable() throws UmpleCompilerException Assert.assertEquals(true,umpleClass.getIsSingleton()); Assert.assertEquals(count, umpleClass.getAssociationVariables().size()); } - @Test public void DoNotNeedAnUmpleFile() @@ -739,54 +768,112 @@ public void getCodeInjectionsFor_notNotation() } @Test - public void getCodeInjectionUnfoundMethodError_simple() + public void getCodeInjectionUnfoundAttriutesMethodError_simple() { String code = "class A{a; after test { foo(); }}"; UmpleModel model = getModel(code); - model.run(); - ParseResult result = model.getLastResult(); - List errors = result.getErrorMessages(); - Assert.assertEquals(errors.size(), 1); - for(ErrorMessage er : errors) - { - Assert.assertTrue(er.toString().contains("1012") && er.toString().contains("test")); + boolean caught = false; + try { + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + Assert.assertEquals(errors.size(), 1); + } catch (Exception e) { + caught = e.getMessage().contains("1012") && e.getMessage().contains("test"); + } finally { + Assert.assertTrue(caught); } } @Test - public void getCodeInjectionUnfoundMethodError_complex() + public void getCodeInjectionUnfoundAttributesMethodError_complex() { - String code = "class A{a; internal b; defaulted c = \"s\"; String[] d; immutable String[] e; after setB,getA,test,resetC,addD,removeE { foo(); }}"; - UmpleModel model = getModel(code); - model.run(); - ParseResult result = model.getLastResult(); - List errors = result.getErrorMessages(); - - Assert.assertEquals(errors.size(), 3); boolean test = false; boolean setB = false; boolean removeE = false; - for(ErrorMessage er : errors) - { - if(er.toString().contains("1012") && er.toString().contains("test")) - { - test = true; - } - else if(er.toString().contains("1012") && er.toString().contains("setB")) - { - setB = true; - } - else if(er.toString().contains("1012") && er.toString().contains("removeE")) - { - removeE = true; - } + String code = "class A{a; internal b; defaulted c = \"s\"; String[] d; immutable String[] e; after setB,getA,test,resetC,addD,removeE { foo(); }}"; + try { + UmpleModel model = getModel(code); + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + + Assert.assertEquals(errors.size(), 3); + } catch (Exception e) { + test = test || (e.getMessage().contains("1012") && e.getMessage().contains("test")); + setB = setB || (e.getMessage().contains("1012") && e.getMessage().contains("setB")); + removeE = removeE || (e.getMessage().contains("1012") && e.getMessage().contains("removeE")); + } finally { + Assert.assertTrue(test); + Assert.assertTrue(setB); + Assert.assertTrue(removeE); } + } + + @Test + public void getCodeInjectionUnfoundAssociationsMethodError_TwoSided() + { + boolean addChildren = false; + String code = "class A{1 -- 1 B; 1 -- * C children; after setB,addOrMoveChildAt,addChild,addChildren{ foo(); }} class B { before setA,getA{ foo(); } } class C {}"; + try { + UmpleModel model = getModel(code); + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + Assert.assertEquals(errors.size(), 1); + } catch (Exception e) { + addChildren = e.getMessage().contains("1012") && e.getMessage().contains("addChildren"); + } finally { + Assert.assertTrue(addChildren); + } + } - Assert.assertTrue(test); - Assert.assertTrue(setB); - Assert.assertTrue(removeE); + @Test + public void getCodeInjectionUnfoundAssociationsMethodError_OneSided() + { + boolean addChildren = false; + boolean setA = false; + boolean getA = false; + String code = "class A{1 -> 1 B; 0..1 -> * C children; after setB,addOrMoveChildAt,addChild,addChildren{ foo(); }} class B { before setA,getA{ foo(); } } class C {}"; + try { + UmpleModel model = getModel(code); + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + Assert.assertEquals(errors.size(), 3); + } catch (Exception e) { + addChildren = addChildren || (e.getMessage().contains("1012") && e.getMessage().contains("addChildren")); + setA = setA || (e.getMessage().contains("1012") && e.getMessage().contains("getA")); + getA = getA || (e.getMessage().contains("1012") && e.getMessage().contains("setA")); + } finally { + Assert.assertTrue(addChildren); + Assert.assertTrue(getA); + Assert.assertTrue(setA); + } } + @Test + public void getCodeInjectionUnfoundExtendedMethod_Simple() + { + String code = "class A { k; } class B { isA A; after setK,getK{ foo(); } }"; + UmpleModel model = getModel(code); + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + Assert.assertEquals(errors.size(), 0); + } + + @Test + public void getCodeInjectionUnfoundExtendedMethod_Complex() + { + String code = "class A { 1 -- * C children; k; } class B { isA A; after setK,getK{ foo(); } class C { isA B; after addChild,getChildA,tsetK,getK{ foo(); }}"; + UmpleModel model = getModel(code); + model.run(); + ParseResult result = model.getLastResult(); + List errors = result.getErrorMessages(); + Assert.assertEquals(errors.size(), 0); + } + @Test public void getAllStateMachines_none() { From 60207dba297b244899e0569f6d48c63016d41dc9 Mon Sep 17 00:00:00 2001 From: Shikib Mehri Date: Mon, 1 Feb 2016 10:30:24 -0800 Subject: [PATCH 3/5] fixed issue with invalid position being passed to errormessage class --- .../src/UmpleInternalParser_CodeClass.ump | 45 +++++++++++++------ .../cruise/umple/compiler/UmpleClassTest.java | 2 +- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/cruise.umple/src/UmpleInternalParser_CodeClass.ump b/cruise.umple/src/UmpleInternalParser_CodeClass.ump index 703a2a9927..c41a7fbad9 100644 --- a/cruise.umple/src/UmpleInternalParser_CodeClass.ump +++ b/cruise.umple/src/UmpleInternalParser_CodeClass.ump @@ -27,6 +27,8 @@ class UmpleInternalParser internal Map> unlinkedExtendsTokensInterface = new HashMap >(); internal Map> unlinkedInterfaceExtends = new HashMap>(); + internal Map> unanalyzedInjectionTokens = new HashMap>(); + // List of comments populated by the parser to be added to the next class, attribute, association, method, etc. internal Comment[] lastComments; @@ -382,13 +384,13 @@ class UmpleInternalParser //Issue 686 private void checkCodeInjections() { - for(UmpleClass uClass : model.getUmpleClasses()) - { - for(CodeInjection injection : uClass.getCodeInjections()) + for(Map.Entry> entry : unanalyzedInjectionTokens.entrySet()) + { + for(Token injectToken : entry.getValue()) { - checkCodeInjectionValidity(injection, uClass); + checkCodeInjectionValidity(injectToken, (UmpleClass) entry.getKey()); } - } + } } public void analyzeInvariants() @@ -2572,14 +2574,11 @@ class UmpleInternalParser return value; } - //TODO I changed the parameter's type. please remove this comment; - private void analyzeInjectionCode(Token injectToken, UmpleClassifier uClassifier) + private String getOperationName(Token aToken) { - String type = injectToken.is("beforeCode") ? "before" : "after"; - CodeBlock cb = new CodeBlock(); StringBuilder operationName = new StringBuilder(); String comma = ""; - for(Token subToken:injectToken.getSubTokens()) + for(Token subToken : aToken.getSubTokens()) { if(subToken.is("operationName")) { @@ -2587,7 +2586,25 @@ class UmpleInternalParser comma = ","; } } - CodeInjection injection = new CodeInjection(type,operationName.toString(),"",uClassifier); + return operationName.toString(); + } + + //TODO I changed the parameter's type. please remove this comment; + private void analyzeInjectionCode(Token injectToken, UmpleClassifier uClassifier) + { + if(!unanalyzedInjectionTokens.containsKey(uClassifier)) + { + unanalyzedInjectionTokens.put(uClassifier, new ArrayList()); + } + + List currentTokens = unanalyzedInjectionTokens.get(uClassifier); + currentTokens.add(injectToken); + + String type = injectToken.is("beforeCode") ? "before" : "after"; + CodeBlock cb = new CodeBlock(); + String operationName = getOperationName(injectToken); + + CodeInjection injection = new CodeInjection(type,operationName,"",uClassifier); makeCodeInject(injectToken,injection,cb,uClassifier); injection.setSnippet(cb); if (uClassifier instanceof UmpleClass) { @@ -2597,9 +2614,9 @@ class UmpleInternalParser } } - private boolean checkCodeInjectionValidity(CodeInjection injection, UmpleClass uClass) { + private boolean checkCodeInjectionValidity(Token injectToken, UmpleClass uClass) { ArrayList methodNames = new ArrayList(); - String operationName = injection.getOperation(); + String operationName = getOperationName(injectToken); ArrayList todoExtendedClasses = new ArrayList(); ArrayList todoInheritedInterfaces = new ArrayList(); @@ -2662,7 +2679,7 @@ class UmpleInternalParser } if(!matches) { - getParseResult().addErrorMessage(new ErrorMessage(1012, injection.getPosition(), operation)); + getParseResult().addErrorMessage(new ErrorMessage(1012, injectToken.getPosition(), operation)); } } diff --git a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java index 73240d94a0..21b6960b5c 100644 --- a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java +++ b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java @@ -866,7 +866,7 @@ public void getCodeInjectionUnfoundExtendedMethod_Simple() @Test public void getCodeInjectionUnfoundExtendedMethod_Complex() { - String code = "class A { 1 -- * C children; k; } class B { isA A; after setK,getK{ foo(); } class C { isA B; after addChild,getChildA,tsetK,getK{ foo(); }}"; + String code = "class A { 1 -- * C children; k; } class B { isA A; after setK,getK{ foo(); } } class C { isA B; after addChild,getChildA,tsetK,getK{ foo(); }}"; UmpleModel model = getModel(code); model.run(); ParseResult result = model.getLastResult(); From c7ab52cf9b9e5c2c6159954d96701058a52bb1f8 Mon Sep 17 00:00:00 2001 From: Shikib Mehri Date: Sun, 7 Feb 2016 20:13:31 -0800 Subject: [PATCH 4/5] fixed tests (only UmpleTraitTest is failing now) --- .../cruise/umple/compiler/UmpleClassTest.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java index 21b6960b5c..993abb45f9 100644 --- a/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java +++ b/cruise.umple/test/cruise/umple/compiler/UmpleClassTest.java @@ -155,9 +155,8 @@ public void getAutouniqueAttributeMethods() { Attribute a = new Attribute("a",null,"autounique",null,false,umpleClass); ArrayList methods = a.getMethodNames(); - Assert.assertTrue(methods.contains("setA")); Assert.assertTrue(methods.contains("getA")); - Assert.assertEquals(methods.size(),2); + Assert.assertEquals(methods.size(),1); } @Test @@ -175,7 +174,12 @@ public void getDefaultedAttributeMethods() @Test public void getSingularAssociationMethods() { + String code = "class B { }"; + UmpleModel model = getModel(code); + UmpleClass aClass = new UmpleClass("B", model); AssociationVariable av = new AssociationVariable("a","A",null,null,createMultiplicity(0,1),true); + av.setUmpleClass(aClass); + ArrayList methods = av.getMethodNames(); Assert.assertTrue(methods.contains("setA")); Assert.assertTrue(methods.contains("getA")); @@ -185,18 +189,23 @@ public void getSingularAssociationMethods() @Test public void getMultipleAssociationMethods() { + String code = "class B { }"; + UmpleModel model = getModel(code); + UmpleClass aClass = new UmpleClass("B", model); AssociationVariable av = new AssociationVariable("as","A",null,null,createMultiplicity(0,-1),true); + av.setUmpleClass(aClass); + ArrayList methods = av.getMethodNames(); Assert.assertTrue(methods.contains("getA")); Assert.assertTrue(methods.contains("getAs")); Assert.assertTrue(methods.contains("numberOfAs")); - Assert.assertTrue(methods.contains("hasA")); + Assert.assertTrue(methods.contains("hasAs")); Assert.assertTrue(methods.contains("indexOfA")); Assert.assertTrue(methods.contains("minimumNumberOfAs")); Assert.assertTrue(methods.contains("addA")); Assert.assertTrue(methods.contains("addAAt")); Assert.assertTrue(methods.contains("addOrMoveAAt")); - Assert.assertTrue(methods.contains("removeoveA")); + Assert.assertTrue(methods.contains("removeA")); Assert.assertEquals(methods.size(),10); } @@ -866,7 +875,7 @@ public void getCodeInjectionUnfoundExtendedMethod_Simple() @Test public void getCodeInjectionUnfoundExtendedMethod_Complex() { - String code = "class A { 1 -- * C children; k; } class B { isA A; after setK,getK{ foo(); } } class C { isA B; after addChild,getChildA,tsetK,getK{ foo(); }}"; + String code = "class A { 1 -- * C children; k; } class B { isA A; after setK,getK{ foo(); } } class C { isA B; after addChild,getChild,setK,getK{ foo(); }}"; UmpleModel model = getModel(code); model.run(); ParseResult result = model.getLastResult(); From 1105586a4cdee81f3c8c800cf746ce1201e982f2 Mon Sep 17 00:00:00 2001 From: Shikib Mehri Date: Mon, 8 Feb 2016 09:25:36 -0800 Subject: [PATCH 5/5] fixed codeInjectTraitsTest failed --- .../src/UmpleInternalParser_CodeClass.ump | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cruise.umple/src/UmpleInternalParser_CodeClass.ump b/cruise.umple/src/UmpleInternalParser_CodeClass.ump index c41a7fbad9..e9373958c6 100644 --- a/cruise.umple/src/UmpleInternalParser_CodeClass.ump +++ b/cruise.umple/src/UmpleInternalParser_CodeClass.ump @@ -2592,14 +2592,6 @@ class UmpleInternalParser //TODO I changed the parameter's type. please remove this comment; private void analyzeInjectionCode(Token injectToken, UmpleClassifier uClassifier) { - if(!unanalyzedInjectionTokens.containsKey(uClassifier)) - { - unanalyzedInjectionTokens.put(uClassifier, new ArrayList()); - } - - List currentTokens = unanalyzedInjectionTokens.get(uClassifier); - currentTokens.add(injectToken); - String type = injectToken.is("beforeCode") ? "before" : "after"; CodeBlock cb = new CodeBlock(); String operationName = getOperationName(injectToken); @@ -2609,6 +2601,14 @@ class UmpleInternalParser injection.setSnippet(cb); if (uClassifier instanceof UmpleClass) { ((UmpleClass)uClassifier).addCodeInjection(injection); + + if(!unanalyzedInjectionTokens.containsKey(uClassifier)) + { + unanalyzedInjectionTokens.put(uClassifier, new ArrayList()); + } + + List currentTokens = unanalyzedInjectionTokens.get(uClassifier); + currentTokens.add(injectToken); } else if (uClassifier instanceof UmpleTrait){ ((UmpleTrait)uClassifier).addCodeInjection(injection); }