Repository: groovy Updated Branches: refs/heads/parrot f886a908e -> 3a035b977
Support default method for interface Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3a035b97 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3a035b97 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3a035b97 Branch: refs/heads/parrot Commit: 3a035b97712f1e59c792a393c2ea4ec3f32a5871 Parents: f886a90 Author: Daniel Sun <[email protected]> Authored: Fri Dec 9 23:51:40 2016 +0800 Committer: Daniel Sun <[email protected]> Committed: Fri Dec 9 23:51:40 2016 +0800 ---------------------------------------------------------------------- .../classgen/asm/BinaryExpressionHelper.java | 72 +++- src/main/org/codehaus/groovy/syntax/Types.java | 8 +- .../stc/StaticTypeCheckingVisitor.java | 194 ++++++++++- .../apache/groovy/parser/antlr4/GroovyParser.g4 | 1 + .../groovy/parser/antlr4/AbstractParser.java | 2 +- .../apache/groovy/parser/antlr4/AstBuilder.java | 348 ++++++++++++++++++- .../groovy/parser/antlr4/GroovySyntaxError.java | 2 - .../parser/antlr4/SemanticPredicates.java | 4 +- .../TryWithResourcesASTTransformation.java | 23 +- .../internal/DescriptiveErrorStrategy.java | 10 +- .../parser/antlr4/GroovyParserTest.groovy | 6 + .../resources/core/DefaultMethod_01x.groovy | 21 ++ .../resources/core/DefaultMethod_02x.groovy | 36 ++ 13 files changed, 693 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/src/main/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java b/src/main/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java index 012cdd9..3279c14 100644 --- a/src/main/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java +++ b/src/main/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java @@ -21,7 +21,24 @@ package org.codehaus.groovy.classgen.asm; import org.codehaus.groovy.GroovyBugError; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; -import org.codehaus.groovy.ast.expr.*; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.ArrayExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ElvisOperatorExpression; +import org.codehaus.groovy.ast.expr.EmptyExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.FieldExpression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.NotExpression; +import org.codehaus.groovy.ast.expr.PostfixExpression; +import org.codehaus.groovy.ast.expr.PrefixExpression; +import org.codehaus.groovy.ast.expr.PropertyExpression; +import org.codehaus.groovy.ast.expr.TernaryExpression; +import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.tools.WideningCategories; import org.codehaus.groovy.classgen.AsmClassGenerator; import org.codehaus.groovy.classgen.BytecodeExpression; @@ -31,8 +48,57 @@ import org.codehaus.groovy.syntax.Types; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; -import static org.codehaus.groovy.syntax.Types.*; -import static org.objectweb.asm.Opcodes.*; +import static org.codehaus.groovy.syntax.Types.BITWISE_AND; +import static org.codehaus.groovy.syntax.Types.BITWISE_AND_EQUAL; +import static org.codehaus.groovy.syntax.Types.BITWISE_OR; +import static org.codehaus.groovy.syntax.Types.BITWISE_OR_EQUAL; +import static org.codehaus.groovy.syntax.Types.BITWISE_XOR; +import static org.codehaus.groovy.syntax.Types.BITWISE_XOR_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_GREATER_THAN; +import static org.codehaus.groovy.syntax.Types.COMPARE_GREATER_THAN_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_IDENTICAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_LESS_THAN; +import static org.codehaus.groovy.syntax.Types.COMPARE_LESS_THAN_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_IDENTICAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_IN; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_INSTANCEOF; +import static org.codehaus.groovy.syntax.Types.COMPARE_TO; +import static org.codehaus.groovy.syntax.Types.DIVIDE; +import static org.codehaus.groovy.syntax.Types.DIVIDE_EQUAL; +import static org.codehaus.groovy.syntax.Types.ELVIS_EQUAL; +import static org.codehaus.groovy.syntax.Types.EQUAL; +import static org.codehaus.groovy.syntax.Types.FIND_REGEX; +import static org.codehaus.groovy.syntax.Types.INTDIV; +import static org.codehaus.groovy.syntax.Types.INTDIV_EQUAL; +import static org.codehaus.groovy.syntax.Types.KEYWORD_IN; +import static org.codehaus.groovy.syntax.Types.KEYWORD_INSTANCEOF; +import static org.codehaus.groovy.syntax.Types.LEFT_SHIFT; +import static org.codehaus.groovy.syntax.Types.LEFT_SHIFT_EQUAL; +import static org.codehaus.groovy.syntax.Types.LEFT_SQUARE_BRACKET; +import static org.codehaus.groovy.syntax.Types.LOGICAL_AND; +import static org.codehaus.groovy.syntax.Types.LOGICAL_OR; +import static org.codehaus.groovy.syntax.Types.MATCH_REGEX; +import static org.codehaus.groovy.syntax.Types.MINUS; +import static org.codehaus.groovy.syntax.Types.MINUS_EQUAL; +import static org.codehaus.groovy.syntax.Types.MOD; +import static org.codehaus.groovy.syntax.Types.MOD_EQUAL; +import static org.codehaus.groovy.syntax.Types.MULTIPLY; +import static org.codehaus.groovy.syntax.Types.MULTIPLY_EQUAL; +import static org.codehaus.groovy.syntax.Types.PLUS; +import static org.codehaus.groovy.syntax.Types.PLUS_EQUAL; +import static org.codehaus.groovy.syntax.Types.POWER; +import static org.codehaus.groovy.syntax.Types.POWER_EQUAL; +import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT; +import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT_EQUAL; +import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT_UNSIGNED; +import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT_UNSIGNED_EQUAL; +import static org.objectweb.asm.Opcodes.ACONST_NULL; +import static org.objectweb.asm.Opcodes.GOTO; +import static org.objectweb.asm.Opcodes.IFEQ; +import static org.objectweb.asm.Opcodes.IFNE; +import static org.objectweb.asm.Opcodes.INSTANCEOF; public class BinaryExpressionHelper { //compare http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/src/main/org/codehaus/groovy/syntax/Types.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/syntax/Types.java b/src/main/org/codehaus/groovy/syntax/Types.java index 538d471..534c5ea 100644 --- a/src/main/org/codehaus/groovy/syntax/Types.java +++ b/src/main/org/codehaus/groovy/syntax/Types.java @@ -20,7 +20,13 @@ package org.codehaus.groovy.syntax; import org.codehaus.groovy.GroovyBugError; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; /** http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index fcec3e0..ddb7ce9 100644 --- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -28,10 +28,61 @@ import groovy.transform.stc.ClosureParams; import groovy.transform.stc.ClosureSignatureConflictResolver; import groovy.transform.stc.ClosureSignatureHint; import org.codehaus.groovy.GroovyBugError; -import org.codehaus.groovy.ast.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassCodeVisitorSupport; import org.codehaus.groovy.ast.ClassHelper; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.ConstructorNode; +import org.codehaus.groovy.ast.DynamicVariable; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.GenericsType; +import org.codehaus.groovy.ast.InnerClassNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.PropertyNode; +import org.codehaus.groovy.ast.Variable; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.AttributeExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BitwiseNegationExpression; +import org.codehaus.groovy.ast.expr.CastExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ClosureExpression; +import org.codehaus.groovy.ast.expr.ClosureListExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.EmptyExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.FieldExpression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; +import org.codehaus.groovy.ast.expr.MethodCall; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.PostfixExpression; +import org.codehaus.groovy.ast.expr.PrefixExpression; +import org.codehaus.groovy.ast.expr.PropertyExpression; +import org.codehaus.groovy.ast.expr.RangeExpression; +import org.codehaus.groovy.ast.expr.SpreadExpression; +import org.codehaus.groovy.ast.expr.StaticMethodCallExpression; +import org.codehaus.groovy.ast.expr.TernaryExpression; +import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.expr.UnaryMinusExpression; +import org.codehaus.groovy.ast.expr.UnaryPlusExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.CaseStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.EmptyStatement; +import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.SwitchStatement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; +import org.codehaus.groovy.ast.stmt.WhileStatement; import org.codehaus.groovy.ast.tools.GenericsUtils; import org.codehaus.groovy.ast.tools.WideningCategories; import org.codehaus.groovy.classgen.ReturnAdder; @@ -51,14 +102,141 @@ import org.codehaus.groovy.util.ListHashMap; import org.objectweb.asm.Opcodes; import java.lang.reflect.Modifier; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import static org.codehaus.groovy.ast.ClassHelper.*; -import static org.codehaus.groovy.ast.tools.WideningCategories.*; -import static org.codehaus.groovy.syntax.Types.*; -import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.*; +import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.BigInteger_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Boolean_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Byte_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type; +import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Character_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.DYNAMIC_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Double_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Float_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.GSTRING_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Integer_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Iterator_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.LIST_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Long_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.MAP_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Number_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.PATTERN_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.RANGE_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.Short_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.boolean_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.byte_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.char_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.double_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.findSAM; +import static org.codehaus.groovy.ast.ClassHelper.float_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.getNextSuperClass; +import static org.codehaus.groovy.ast.ClassHelper.getUnwrapper; +import static org.codehaus.groovy.ast.ClassHelper.getWrapper; +import static org.codehaus.groovy.ast.ClassHelper.int_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.isNumberType; +import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveType; +import static org.codehaus.groovy.ast.ClassHelper.isSAMType; +import static org.codehaus.groovy.ast.ClassHelper.long_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.make; +import static org.codehaus.groovy.ast.ClassHelper.short_TYPE; +import static org.codehaus.groovy.ast.ClassHelper.void_WRAPPER_TYPE; +import static org.codehaus.groovy.ast.tools.WideningCategories.LowestUpperBoundClassNode; +import static org.codehaus.groovy.ast.tools.WideningCategories.isBigDecCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isBigIntCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isDouble; +import static org.codehaus.groovy.ast.tools.WideningCategories.isDoubleCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isFloat; +import static org.codehaus.groovy.ast.tools.WideningCategories.isFloatingCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isIntCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isLongCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.isNumberCategory; +import static org.codehaus.groovy.ast.tools.WideningCategories.lowestUpperBound; +import static org.codehaus.groovy.syntax.Types.ASSIGN; +import static org.codehaus.groovy.syntax.Types.ASSIGNMENT_OPERATOR; +import static org.codehaus.groovy.syntax.Types.COMPARE_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_EQUAL; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_IN; +import static org.codehaus.groovy.syntax.Types.COMPARE_NOT_INSTANCEOF; +import static org.codehaus.groovy.syntax.Types.COMPARE_TO; +import static org.codehaus.groovy.syntax.Types.DIVIDE; +import static org.codehaus.groovy.syntax.Types.DIVIDE_EQUAL; +import static org.codehaus.groovy.syntax.Types.ELVIS_EQUAL; +import static org.codehaus.groovy.syntax.Types.EQUAL; +import static org.codehaus.groovy.syntax.Types.FIND_REGEX; +import static org.codehaus.groovy.syntax.Types.KEYWORD_IN; +import static org.codehaus.groovy.syntax.Types.KEYWORD_INSTANCEOF; +import static org.codehaus.groovy.syntax.Types.LEFT_SQUARE_BRACKET; +import static org.codehaus.groovy.syntax.Types.MINUS_MINUS; +import static org.codehaus.groovy.syntax.Types.MOD; +import static org.codehaus.groovy.syntax.Types.MOD_EQUAL; +import static org.codehaus.groovy.syntax.Types.PLUS_PLUS; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.ArrayList_TYPE; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.Collection_TYPE; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.Matcher_TYPE; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.UNKNOWN_PARAMETER_TYPE; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.addMethodLevelDeclaredGenerics; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.allParametersAndArgumentsMatch; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsConnections; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsContext; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsContextToParameterClass; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.boundUnboundedWildcards; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.checkCompatibleAssignmentTypes; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.checkPossibleLooseOfPrecision; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.evaluateExpression; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.extractGenericsConnections; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.extractGenericsParameterMapOfThis; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findSetters; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findTargetVariable; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.fullyResolveType; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.getGenericsWithoutArray; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.getOperationName; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isArrayOp; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isAssignableTo; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isAssignment; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isBeingCompiled; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isBitOperator; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isBoolIntrinsicOp; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isCompareToBoolean; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isOperationInGroup; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isParameterizedWithGStringOrGStringString; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isParameterizedWithString; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isPowerOperator; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isShiftOperation; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isTraitSelf; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isUsingGenericsOrIsArrayUsingGenerics; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isVargs; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isWildcardLeftHandSide; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.lastArgMatchesVarg; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.missesGenericsTypes; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.prettyPrintType; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.resolveClassNodeGenerics; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.toMethodParametersString; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.typeCheckMethodArgumentWithGenerics; +import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.typeCheckMethodsWithGenerics; /** * The main class code visitor responsible for static type checking. It will perform various inspections like checking http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4 ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4 b/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4 index 2f93cab..ad95fef 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4 +++ b/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4 @@ -179,6 +179,7 @@ classOrInterfaceModifier | ABSTRACT // class or interface | FINAL // class only -- does not apply to interfaces | STRICTFP // class or interface + | DEFAULT // interface only -- does not apply to classes ) ; http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java index 44c51c4..95f493d 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AbstractParser.java @@ -18,8 +18,8 @@ */ package org.apache.groovy.parser.antlr4; -import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.TokenStream; /** * Because antlr4 does not support generating parser with specified interface, http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java index 31124d6..b046f98 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java @@ -19,7 +19,13 @@ package org.apache.groovy.parser.antlr4; import groovy.lang.IntRange; -import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.ANTLRErrorListener; +import org.antlr.v4.runtime.ANTLRInputStream; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.misc.ParseCancellationException; import org.antlr.v4.runtime.tree.ParseTree; @@ -29,9 +35,77 @@ import org.apache.groovy.parser.antlr4.internal.DescriptiveErrorStrategy; import org.apache.groovy.parser.antlr4.util.StringUtils; import org.codehaus.groovy.GroovyBugError; import org.codehaus.groovy.antlr.EnumHelper; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.EnumConstantClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.GenericsType; +import org.codehaus.groovy.ast.ImportNode; +import org.codehaus.groovy.ast.InnerClassNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.ModuleNode; +import org.codehaus.groovy.ast.PackageNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.PropertyNode; +import org.codehaus.groovy.ast.expr.AnnotationConstantExpression; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.ArrayExpression; +import org.codehaus.groovy.ast.expr.AttributeExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BitwiseNegationExpression; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.CastExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ClosureExpression; +import org.codehaus.groovy.ast.expr.ClosureListExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.ElvisOperatorExpression; +import org.codehaus.groovy.ast.expr.EmptyExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.GStringExpression; +import org.codehaus.groovy.ast.expr.LambdaExpression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.MethodPointerExpression; +import org.codehaus.groovy.ast.expr.MethodReferenceExpression; +import org.codehaus.groovy.ast.expr.NamedArgumentListExpression; +import org.codehaus.groovy.ast.expr.NotExpression; +import org.codehaus.groovy.ast.expr.PostfixExpression; +import org.codehaus.groovy.ast.expr.PrefixExpression; +import org.codehaus.groovy.ast.expr.PropertyExpression; +import org.codehaus.groovy.ast.expr.RangeExpression; +import org.codehaus.groovy.ast.expr.SpreadExpression; +import org.codehaus.groovy.ast.expr.SpreadMapExpression; +import org.codehaus.groovy.ast.expr.TernaryExpression; +import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.expr.UnaryMinusExpression; +import org.codehaus.groovy.ast.expr.UnaryPlusExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.AssertStatement; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.BreakStatement; +import org.codehaus.groovy.ast.stmt.CaseStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.ContinueStatement; +import org.codehaus.groovy.ast.stmt.DoWhileStatement; +import org.codehaus.groovy.ast.stmt.EmptyStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.SwitchStatement; +import org.codehaus.groovy.ast.stmt.SynchronizedStatement; +import org.codehaus.groovy.ast.stmt.ThrowStatement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; +import org.codehaus.groovy.ast.stmt.WhileStatement; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; @@ -48,13 +122,227 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.apache.groovy.parser.antlr4.GroovyLangParser.*; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ABSTRACT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ADD; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AS; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AdditiveExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AndExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnnotationsOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AnonymousInnerClassDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ArrayInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AssertStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.AssignmentExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BlockStatementsOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BooleanLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BreakStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BreakStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.BuiltInTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CASE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CastExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CastParExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CatchClauseContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CatchTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassBodyDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClassOrInterfaceTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClosureContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ClosurePrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandArgumentContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CommandExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CompilationUnitContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ConditionalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ContinueStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ContinueStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CreatedNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.CreatorContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DEFAULT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DoWhileStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.DynamicMemberNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValueArrayInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValueContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuePairContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ElementValuePairsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedArgumentListElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnhancedForControlContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnumConstantContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EnumConstantsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.EqualityExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExclusiveOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionListElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ExpressionStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FINAL; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FieldDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FinallyBlockContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FloatingPointLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForControlContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForInitContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ForUpdateContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParameterListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.FormalParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GroovyParserRuleContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringPathContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.GstringValueContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IN; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.INC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.INSTANCEOF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IdentifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IdentifierPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IfElseStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ImportDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ImportStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.InclusiveOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IndexPropertyArgsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.IntegerLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.KeywordsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LabeledStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LambdaBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LambdaPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LastFormalParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ListPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LiteralPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LocalVariableDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LocalVariableDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LogicalAndExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LogicalOrExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.LoopStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryLabelContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapEntryListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MapPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MemberDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodBodyContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MethodNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MultipleAssignmentExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.MultiplicativeExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NATIVE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NOT_IN; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NOT_INSTANCEOF; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NamePartContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NamedPropertyArgsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NewPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NlsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NonWildcardTypeArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NormalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.NullLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PRIVATE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PROTECTED; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PUBLIC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PackageDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ParExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ParenPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PathElementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PathExpressionContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PostfixExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PowerExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.PrimitiveTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedClassNameListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.QualifiedStandardClassNameContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.RegexExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.RelationalExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourceContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourceListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ResourcesContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ReturnStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ReturnTypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.STATIC; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.STRICTFP; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SUB; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SYNCHRONIZED; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SepContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ShiftExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StandardLambdaParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StringLiteralAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.StringLiteralContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SuperPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchBlockStatementGroupContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchLabelContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SwitchStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.SynchronizedStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TRANSIENT; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ThisPrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.ThrowStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TryCatchStatementContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TryCatchStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeArgumentsOrDiamondContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeBoundContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeDeclarationStmtAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeListContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeNamePairContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeNamePairsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeParameterContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypeParametersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.TypePrmrAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.UnaryAddExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.UnaryNotExprAltContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VOLATILE; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclarationContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorIdContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableDeclaratorsContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableInitializerContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifierContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifiersContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableModifiersOptContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.VariableNamesContext; +import static org.apache.groovy.parser.antlr4.GroovyLangParser.WhileStmtAltContext; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.last; @@ -809,12 +1097,22 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov classNode.addAnnotations(modifierManager.getAnnotations()); classNode.setGenericsTypes(this.visitTypeParameters(ctx.typeParameters())); - if (asBoolean(ctx.CLASS()) || asBoolean(ctx.TRAIT())) { // class OR trait + boolean isInterface = asBoolean(ctx.INTERFACE()) && !asBoolean(ctx.AT()); + boolean isInterfaceWithDefaultMethods = false; + + // declaring interface with default method + if (isInterface && this.containsDefaultMethods(ctx)) { + isInterfaceWithDefaultMethods = true; + classNode.addAnnotation(new AnnotationNode(ClassHelper.make(GROOVY_TRANSFORM_TRAIT))); + classNode.putNodeMetaData(IS_INTERFACE_WITH_DEFAULT_METHODS, true); + } + + if (asBoolean(ctx.CLASS()) || asBoolean(ctx.TRAIT()) || isInterfaceWithDefaultMethods) { // class OR trait OR interface with default methods classNode.setSuperClass(this.visitType(ctx.sc)); classNode.setInterfaces(this.visitTypeList(ctx.is)); this.initUsingGenerics(classNode); - } else if (asBoolean(ctx.INTERFACE()) && !asBoolean(ctx.AT())) { // interface(NOT annotation) + } else if (isInterface) { // interface(NOT annotation) classNode.setModifiers(classNode.getModifiers() | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT); classNode.setSuperClass(ClassHelper.OBJECT_TYPE); @@ -863,6 +1161,26 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov return classNode; } + @SuppressWarnings({"unchecked"}) + private boolean containsDefaultMethods(ClassDeclarationContext ctx) { + List<MethodDeclarationContext> methodDeclarationContextList = + (List<MethodDeclarationContext>) ctx.classBody().classBodyDeclaration().stream() + .map(ClassBodyDeclarationContext::memberDeclaration) + .filter(Objects::nonNull) + .map(e -> (Object) e.methodDeclaration()) + .filter(Objects::nonNull).reduce(new LinkedList<MethodDeclarationContext>(), (r, e) -> { + MethodDeclarationContext methodDeclarationContext = (MethodDeclarationContext) e; + + if (createModifierManager(methodDeclarationContext).contains(DEFAULT)) { + ((List) r).add(methodDeclarationContext); + } + + return r; + }); + + return !methodDeclarationContextList.isEmpty(); + } + @Override public Void visitClassBody(ClassBodyContext ctx) { ClassNode classNode = ctx.getNodeMetaData(CLASS_DECLARATION_CLASS_NODE); @@ -1092,8 +1410,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov return null; } - @Override - public MethodNode visitMethodDeclaration(MethodDeclarationContext ctx) { + private ModifierManager createModifierManager(MethodDeclarationContext ctx) { List<ModifierNode> modifierNodeList = Collections.emptyList(); if (asBoolean(ctx.modifiers())) { @@ -1102,7 +1419,12 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov modifierNodeList = this.visitModifiersOpt(ctx.modifiersOpt()); } - ModifierManager modifierManager = new ModifierManager(modifierNodeList); + return new ModifierManager(modifierNodeList); + } + + @Override + public MethodNode visitMethodDeclaration(MethodDeclarationContext ctx) { + ModifierManager modifierManager = createModifierManager(ctx); String methodName = this.visitMethodName(ctx.methodName()); ClassNode returnType = this.visitReturnType(ctx.returnType()); Parameter[] parameters = this.visitFormalParameters(ctx.formalParameters()); @@ -1144,7 +1466,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov } - modifiers |= classNode.isInterface() ? Opcodes.ACC_ABSTRACT : 0; + modifiers |= classNode.isInterface() || (isTrue(classNode, IS_INTERFACE_WITH_DEFAULT_METHODS) && !modifierManager.contains(DEFAULT)) ? Opcodes.ACC_ABSTRACT : 0; methodNode = classNode.addMethod(methodName, modifiers, returnType, parameters, exceptions, code); methodNode.setAnnotationDefault(asBoolean(ctx.elementValue())); @@ -4153,6 +4475,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov put(ABSTRACT, Opcodes.ACC_ABSTRACT); put(FINAL, Opcodes.ACC_FINAL); put(STRICTFP, Opcodes.ACC_STRICT); + put(DEFAULT, 0); // no flag for specifying a default method in the JVM spec, hence no ACC_DEFAULT flag in ASM } }; @@ -4388,6 +4711,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov private static final String IS_SWITCH_DEFAULT = "_IS_SWITCH_DEFAULT"; private static final String IS_NUMERIC = "_IS_NUMERIC"; private static final String IS_STRING = "_IS_STRING"; + private static final String IS_INTERFACE_WITH_DEFAULT_METHODS = "_IS_INTERFACE_WITH_DEFAULT_METHODS"; private static final String PATH_EXPRESSION_BASE_EXPR = "_PATH_EXPRESSION_BASE_EXPR"; private static final String PATH_EXPRESSION_BASE_EXPR_GENERICS_TYPES = "_PATH_EXPRESSION_BASE_EXPR_GENERICS_TYPES"; http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/GroovySyntaxError.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/GroovySyntaxError.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/GroovySyntaxError.java index 5dc829d..12bb63d 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/GroovySyntaxError.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/GroovySyntaxError.java @@ -18,8 +18,6 @@ */ package org.apache.groovy.parser.antlr4; -import java.util.IllegalFormatCodePointException; - /** * Represents a syntax error of groovy program */ http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/SemanticPredicates.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/SemanticPredicates.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/SemanticPredicates.java index 0d5fde3..e306e89 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/SemanticPredicates.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/SemanticPredicates.java @@ -21,7 +21,9 @@ package org.apache.groovy.parser.antlr4; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.TokenStream; -import static org.apache.groovy.parser.antlr4.GroovyParser.*; +import static org.apache.groovy.parser.antlr4.GroovyParser.CapitalizedIdentifier; +import static org.apache.groovy.parser.antlr4.GroovyParser.Identifier; +import static org.apache.groovy.parser.antlr4.GroovyParser.StringLiteral; /** * Some semantic predicates for altering the behaviour of the lexer and parser http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/TryWithResourcesASTTransformation.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/TryWithResourcesASTTransformation.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/TryWithResourcesASTTransformation.java index b249d5f..e342a3f 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/TryWithResourcesASTTransformation.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/TryWithResourcesASTTransformation.java @@ -2,8 +2,21 @@ package org.apache.groovy.parser.antlr4; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.Parameter; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.EmptyStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.ThrowStatement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; import org.codehaus.groovy.syntax.Types; import org.objectweb.asm.Opcodes; @@ -73,7 +86,7 @@ public class TryWithResourcesASTTransformation { return variableDeclaration; } - private long primaryExcCnt = 0; + private int primaryExcCnt = 0; private String genPrimaryExcName() { return "__$$primaryExc" + primaryExcCnt++; } @@ -229,7 +242,7 @@ public class TryWithResourcesASTTransformation { return new CatchStatement(tExcParameter, blockStatement); } - private long tExcCnt = 0; + private int tExcCnt = 0; private String genTExcName() { return "__$$t" + tExcCnt++; } @@ -303,7 +316,7 @@ public class TryWithResourcesASTTransformation { return astBuilder.createBlockStatement(finallyBlock); } - private long suppressedExcCnt = 0; + private int suppressedExcCnt = 0; private String genSuppressedExcName() { return "__$$suppressedExc" + suppressedExcCnt++; } http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/internal/DescriptiveErrorStrategy.java ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/internal/DescriptiveErrorStrategy.java b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/internal/DescriptiveErrorStrategy.java index c2c5afe..12081ed 100644 --- a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/internal/DescriptiveErrorStrategy.java +++ b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/internal/DescriptiveErrorStrategy.java @@ -18,7 +18,15 @@ */ package org.apache.groovy.parser.antlr4.internal; -import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.BailErrorStrategy; +import org.antlr.v4.runtime.FailedPredicateException; +import org.antlr.v4.runtime.InputMismatchException; +import org.antlr.v4.runtime.NoViableAltException; +import org.antlr.v4.runtime.Parser; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.misc.ParseCancellationException; http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy b/subprojects/groovy-antlr4-grammar/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy index dc89f17..cc657c4 100644 --- a/subprojects/groovy-antlr4-grammar/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy +++ b/subprojects/groovy-antlr4-grammar/src/test/groovy/org/apache/groovy/parser/antlr4/GroovyParserTest.groovy @@ -240,6 +240,12 @@ class GroovyParserTest extends GroovyTestCase { doRunAndTest('core/NegativeRelationalOperators_02x.groovy'); } + void "test groovy core - DefaultMethod"() { + doRunAndTest('core/DefaultMethod_01x.groovy'); + doRunAndTest('core/DefaultMethod_02x.groovy'); + } + + void "test groovy core - Switch"() { doTest('core/Switch_01.groovy'); } http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_01x.groovy ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_01x.groovy b/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_01x.groovy new file mode 100644 index 0000000..eec33f2 --- /dev/null +++ b/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_01x.groovy @@ -0,0 +1,21 @@ + +interface Greetable { + String name(); + default String hello() { + return 'hello' + } + default public String sayHello() { + return this.hello() + ', ' + this.name() + } +} + +class Person implements Greetable { + @Override + public String name() { + return 'Daniel' + } +} + +def p = new Person() +assert 'hello, Daniel' == "${p.hello()}, ${p.name()}" +assert 'hello, Daniel' == p.sayHello() \ No newline at end of file http://git-wip-us.apache.org/repos/asf/groovy/blob/3a035b97/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_02x.groovy ---------------------------------------------------------------------- diff --git a/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_02x.groovy b/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_02x.groovy new file mode 100644 index 0000000..e2053c6 --- /dev/null +++ b/subprojects/groovy-antlr4-grammar/src/test/resources/core/DefaultMethod_02x.groovy @@ -0,0 +1,36 @@ +interface A { + default String hello() { + return 'hello' + } + default String a() { + return 'a' + } + String b(); +} + +interface B extends A { + public String world(); +} + +class C implements B { + public static String haha() { return 'haha' } + + public String world() { + return 'world' + } + + public String name() { + return 'c' + } + + public String a() { + return 'a1'; + } + + public String b() { + return 'b' + } +} + +def c = new C() +assert 'hello, world, c, a1, b, haha' == "${c.hello()}, ${c.world()}, ${c.name()}, ${c.a()}, ${c.b()}, ${C.haha()}" \ No newline at end of file
