fix interface override checking
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/dad773a2 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/dad773a2 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/dad773a2 Branch: refs/heads/master Commit: dad773a2193b5a80aee1e5a5f82d30b82ac19431 Parents: 6e14d68 Author: Alex Harui <[email protected]> Authored: Wed Mar 8 22:42:14 2017 -0800 Committer: Alex Harui <[email protected]> Committed: Wed Mar 8 22:42:14 2017 -0800 ---------------------------------------------------------------------- .../semantics/MethodBodySemanticChecker.java | 7 +++ .../src/test/java/as/ASInheritanceTests.java | 59 ++++++++++++++++++++ 2 files changed, 66 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dad773a2/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java ---------------------------------------------------------------------- diff --git a/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java b/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java index 1b51727..3904823 100644 --- a/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java +++ b/compiler/src/main/java/org/apache/flex/compiler/internal/semantics/MethodBodySemanticChecker.java @@ -2799,7 +2799,14 @@ public class MethodBodySemanticChecker if( conflicts.size() > 0 ) { for( IFunctionDefinition overriden : conflicts ) + { + if ((overriden instanceof SetterDefinition && + funcDef instanceof GetterDefinition) || + (overriden instanceof GetterDefinition && + funcDef instanceof SetterDefinition)) + continue; addProblem(new InterfaceMethodOverrideProblem(iNode, funcDef.getBaseName(), overriden.getParent().getBaseName())); + } } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/dad773a2/compiler/src/test/java/as/ASInheritanceTests.java ---------------------------------------------------------------------- diff --git a/compiler/src/test/java/as/ASInheritanceTests.java b/compiler/src/test/java/as/ASInheritanceTests.java index 4d1d393..b5833e1 100644 --- a/compiler/src/test/java/as/ASInheritanceTests.java +++ b/compiler/src/test/java/as/ASInheritanceTests.java @@ -83,4 +83,63 @@ public class ASInheritanceTests extends ASFeatureTestsBase{ compileAndExpectErrors(source, false,false,false, null,"No default constructor found in base class A.\n"); } + + @Test + public void InterfaceOverrideError() + { + // all tests can assume that flash.display.Sprite + // flash.system.System and flash.events.Event have been imported + String[] imports = new String[] + { + }; + String[] declarations = new String[] + { + }; + String[] testCode = new String[] + { + + }; + String[] extra = new String[] + { + "interface A {", + "function get text():String;", + "}", + "interface B extends A {", + "function get text():String;", + "}" + }; + String source = getAS(imports, declarations, testCode, extra); + + compileAndExpectErrors(source, false,false,false, null,"Cannot override an interface method. Method text conflicts with a method in base interface A.\n"); + } + + @Test + public void InterfaceOverrideOK() + { + // all tests can assume that flash.display.Sprite + // flash.system.System and flash.events.Event have been imported + String[] imports = new String[] + { + }; + String[] declarations = new String[] + { + }; + String[] testCode = new String[] + { + + }; + String[] extra = new String[] + { + "interface A {", + "function get text():String;", + "}", + "interface B extends A {", + "function set text(value:String):void;", + "}" + }; + String source = getAS(imports, declarations, testCode, extra); + + compileAndRun(source);; + } + }
