detect calls to nonFunctions
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/1642c4ea Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/1642c4ea Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/1642c4ea Branch: refs/heads/develop Commit: 1642c4ea15225eb972772473fafad459bf64c1a9 Parents: 7f3621a Author: Alex Harui <[email protected]> Authored: Mon Aug 22 07:47:26 2016 -0700 Committer: Alex Harui <[email protected]> Committed: Tue Aug 23 22:01:59 2016 -0700 ---------------------------------------------------------------------- .../semantics/MethodBodySemanticChecker.java | 16 ++++++++ .../problems/CallNonFunctionProblem.java | 42 ++++++++++++++++++++ compiler/src/test/java/as/ASVariableTests.java | 26 ++++++++++++ 3 files changed, 84 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1642c4ea/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 c91fcf4..04eb040 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 @@ -850,6 +850,22 @@ public class MethodBodySemanticChecker FunctionDefinition func = (FunctionDefinition)def; checkFormalsVsActuals(iNode, func, actuals); } + else if ( def instanceof VariableDefinition ) + { + VariableDefinition varDef = (VariableDefinition)def; + IDefinition varType = varDef.resolveType(project); + if (varType == null || // Null here means the ANY_TYPE + varType.equals(project.getBuiltinType(BuiltinType.FUNCTION)) || + varType.equals(project.getBuiltinType(BuiltinType.OBJECT)) || + varType.equals(project.getBuiltinType(BuiltinType.ANY_TYPE))) + { + // assume it can be called + } + else + { + addProblem(new CallNonFunctionProblem(iNode, method_binding.getName().getBaseName())); + } + } else if ( def == project.getBuiltinType(BuiltinType.ARRAY) ) { // Warn about calling Array as a function because developers http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1642c4ea/compiler/src/main/java/org/apache/flex/compiler/problems/CallNonFunctionProblem.java ---------------------------------------------------------------------- diff --git a/compiler/src/main/java/org/apache/flex/compiler/problems/CallNonFunctionProblem.java b/compiler/src/main/java/org/apache/flex/compiler/problems/CallNonFunctionProblem.java new file mode 100644 index 0000000..50f075c --- /dev/null +++ b/compiler/src/main/java/org/apache/flex/compiler/problems/CallNonFunctionProblem.java @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.flex.compiler.problems; + +import org.apache.flex.compiler.tree.as.IASNode; + +/** + * Strict semantics diagnostic emitted when the method body + * semantic checker detects a call to function that isn't of type function. + */ +public final class CallNonFunctionProblem extends StrictSemanticsProblem +{ + public static final String DESCRIPTION = + "Call to ${methodName} is not a function."; + + public static final int errorCode = 1181; + + public CallNonFunctionProblem(IASNode node, String methodName) + { + super(node); + this.methodName = methodName; + } + + public final String methodName; +} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/1642c4ea/compiler/src/test/java/as/ASVariableTests.java ---------------------------------------------------------------------- diff --git a/compiler/src/test/java/as/ASVariableTests.java b/compiler/src/test/java/as/ASVariableTests.java index 10314d9..f4684fd 100644 --- a/compiler/src/test/java/as/ASVariableTests.java +++ b/compiler/src/test/java/as/ASVariableTests.java @@ -106,6 +106,32 @@ public class ASVariableTests extends ASFeatureTestsBase compileAndRun(source); } + @Test + public void ASVariableTests_localVarSameNameAsPrivateMethod() + { + // 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[] + { + "private function isVertical():Boolean { return false; }", + }; + String[] testCode = new String[] + { + // this threw an exception when the generated code + // tried to call the value of the local var. + // mxmlc will generate a call to the method + // without require a this.isVertical to reference + // the instance method. + "var isVertical:Boolean = isVertical();", + "assertEqual('null', isVertical, false);", + }; + String source = getAS(imports, declarations, testCode, new String[0]); + compileAndRun(source); + } + /* public void ASVariableTests_VectorInitializer() {
