From commits-return-6535-archive-asf-public=cust-asf.ponee.io@groovy.apache.org Wed May 16 01:56:57 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 72F1F180634 for ; Wed, 16 May 2018 01:56:56 +0200 (CEST) Received: (qmail 65593 invoked by uid 500); 15 May 2018 23:56:55 -0000 Mailing-List: contact commits-help@groovy.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@groovy.apache.org Delivered-To: mailing list commits@groovy.apache.org Received: (qmail 65584 invoked by uid 99); 15 May 2018 23:56:55 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 May 2018 23:56:55 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7261EF6D48; Tue, 15 May 2018 23:56:55 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sunlan@apache.org To: commits@groovy.apache.org Message-Id: <8f38977c6a004077b1e606fc50a02396@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: groovy git commit: Revert "GROOVY-8355: Instanceof inference does not work on field assigning(closes #706)" for the time being Date: Tue, 15 May 2018 23:56:55 +0000 (UTC) Repository: groovy Updated Branches: refs/heads/GROOVY_2_5_X 7804d4ea9 -> 49f9111b1 Revert "GROOVY-8355: Instanceof inference does not work on field assigning(closes #706)" for the time being See https://github.com/apache/groovy/pull/706 (cherry picked from commit 8c45479) Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/49f9111b Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/49f9111b Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/49f9111b Branch: refs/heads/GROOVY_2_5_X Commit: 49f9111b1c2d4b2d8ae20726dbc13fa576f1760e Parents: 7804d4e Author: sunlan Authored: Wed May 16 07:46:45 2018 +0800 Committer: sunlan Committed: Wed May 16 07:56:41 2018 +0800 ---------------------------------------------------------------------- .../asm/sc/StaticTypesCallSiteWriter.java | 26 +---- .../stc/StaticTypeCheckingVisitor.java | 94 ---------------- src/spec/test/typing/TypeCheckingTest.groovy | 2 - src/test/groovy/bugs/Groovy8355Bug.groovy | 112 ------------------- 4 files changed, 2 insertions(+), 232 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/49f9111b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java index 9966062..164b598 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java @@ -671,14 +671,8 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes if (receiver instanceof VariableExpression && rType == null) { // TODO: can STCV be made smarter to avoid this check? Variable accessedVariable = ((VariableExpression)receiver).getAccessedVariable(); - VariableExpression ve; - if (accessedVariable instanceof FieldNode) { - FieldNode fieldNode = (FieldNode) accessedVariable; - rType = getInferredTypeOfField(fieldNode); - } else { - ve = (VariableExpression) accessedVariable; - rType = ve.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE); - } + VariableExpression ve = (VariableExpression) accessedVariable; + rType = ve.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE); } if (rType!=null && trySubscript(receiver, message, arguments, rType, aType)) { return; @@ -691,22 +685,6 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter implements Opcodes "this error and file a bug report at https://issues.apache.org/jira/browse/GROOVY"); } - private ClassNode getInferredTypeOfField(FieldNode fieldNode) { - ClassNode rType = null; - - Map nodeMetaData = fieldNode.getNodeMetaData(controller.getMethodNode()); - if (null != nodeMetaData) { - rType = (ClassNode) nodeMetaData.get(StaticTypesMarker.INFERRED_TYPE); -// if (null == rType) { -// nodeMetaData = fieldNode.getNodeMetaData(controller.getClassNode()); -// if (null != nodeMetaData) { -// rType = (ClassNode) nodeMetaData.get(StaticTypesMarker.INFERRED_TYPE); -// } -// } - } - return rType; - } - private boolean trySubscript(final Expression receiver, final String message, final Expression arguments, ClassNode rType, final ClassNode aType) { if (getWrapper(rType).isDerivedFrom(Number_TYPE) && getWrapper(aType).isDerivedFrom(Number_TYPE)) { http://git-wip-us.apache.org/repos/asf/groovy/blob/49f9111b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index f0e105f..9f7637f 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -591,7 +591,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { } } else if (accessedVariable instanceof FieldNode) { FieldNode fieldNode = (FieldNode) accessedVariable; - FieldVariableExpression fieldVariableExpression = new FieldVariableExpression(fieldNode); ClassNode parameterizedType = GenericsUtils.findParameterizedType(fieldNode.getDeclaringClass(), typeCheckingContext.getEnclosingClassNode()); if (null != parameterizedType) { @@ -599,7 +598,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { ClassNode actualType = findActualTypeByPlaceholderName(originalType.getUnresolvedName(), GenericsUtils.extractPlaceholders(parameterizedType)); if (null != actualType) { - fieldVariableExpression.storeInferredType(actualType); storeType(vexp, actualType); return; } @@ -846,13 +844,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { // if right expression is a ClosureExpression, store parameter type information if (leftExpression instanceof VariableExpression) { - VariableExpression variableExpression = (VariableExpression) leftExpression; - - final Variable accessedVariable = variableExpression.getAccessedVariable(); - if (accessedVariable instanceof FieldNode) { - new FieldVariableExpression((FieldNode) accessedVariable).storeInferredType(resultType); - } - if (rightExpression instanceof ClosureExpression) { Parameter[] parameters = ((ClosureExpression) rightExpression).getParameters(); leftExpression.putNodeMetaData(StaticTypesMarker.CLOSURE_ARGUMENTS, parameters); @@ -1759,8 +1750,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { if (init instanceof ConstructorCallExpression) { inferDiamondType((ConstructorCallExpression) init, node.getOriginType()); } - -// new FieldVariableExpression(node).storeInferredType(getType(init)); } } finally { currentField = null; @@ -4471,15 +4460,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { if (cn != null) { return cn; } - - if (exp instanceof FieldNode) { - ClassNode inferredType = new FieldVariableExpression((FieldNode) exp).getInferredType(); - - if (null != inferredType) { - return inferredType; - } - } - if (exp instanceof ClassExpression) { ClassNode node = CLASS_Type.getPlainNodeReference(); node.setGenericsTypes(new GenericsType[]{ @@ -5417,78 +5397,4 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { return parameter.equals(other); } } - - private class FieldVariableExpression extends VariableExpression { - private final FieldNode fieldNode; - - FieldVariableExpression(FieldNode fieldNode) { - super(fieldNode); - this.fieldNode = fieldNode; - - ClassNode inferred = getInferredType(); - if (inferred == null) { - storeInferredType(fieldNode.getOriginType()); - } - } - - @Override - public ListHashMap getMetaDataMap() { - AnnotatedNode node = getKey(); - - return getMetaDataMap(node); - } - - private ListHashMap getMetaDataMap(AnnotatedNode key) { - if (null == key) { - return new ListHashMap(); // all valid cases should have a methodNode as key. return a empty map is just to avoid NPE, the map will be abandoned finally - } - - ListHashMap metaDataMap = fieldNode.getNodeMetaData(key); - - if (null == metaDataMap) { - metaDataMap = new ListHashMap(); - fieldNode.putNodeMetaData(key, metaDataMap); - } - - return metaDataMap; - } - - @Override - public int hashCode() { - return fieldNode.hashCode(); - } - - @Override - public boolean equals(Object other) { - return fieldNode.equals(other); - } - - @SuppressWarnings("unchecked") - private ClassNode getInferredType() { - Map enclosingMetaData = getMetaDataMap(); - - ClassNode inferredType = (ClassNode) enclosingMetaData.get(StaticTypesMarker.INFERRED_TYPE); - - return inferredType; -// return null == inferredType ? (ClassNode) getMetaDataMap(getDefaultKey()).get(StaticTypesMarker.INFERRED_TYPE) : inferredType; - } - - @SuppressWarnings("unchecked") - private void storeInferredType(ClassNode inferredType) { - Map enclosingMetaData = getMetaDataMap(); - - enclosingMetaData.put(StaticTypesMarker.INFERRED_TYPE, inferredType); - } - - private AnnotatedNode getKey() { - AnnotatedNode node = typeCheckingContext.getEnclosingMethod(); - - return node; -// return null == node ? getDefaultKey() : node; - } - -// private ClassNode getDefaultKey() { -// return typeCheckingContext.getEnclosingClassNode(); -// } - } } http://git-wip-us.apache.org/repos/asf/groovy/blob/49f9111b/src/spec/test/typing/TypeCheckingTest.groovy ---------------------------------------------------------------------- diff --git a/src/spec/test/typing/TypeCheckingTest.groovy b/src/spec/test/typing/TypeCheckingTest.groovy index 6574c37..fc87413 100644 --- a/src/spec/test/typing/TypeCheckingTest.groovy +++ b/src/spec/test/typing/TypeCheckingTest.groovy @@ -518,7 +518,6 @@ class TypeCheckingTest extends StaticTypeCheckingTestCase { } - /* void testTypeInferenceFieldVsLocalVariable() { shouldFailWithMessages ''' // tag::typeinference_field_vs_local_variable[] @@ -545,7 +544,6 @@ class TypeCheckingTest extends StaticTypeCheckingTestCase { SomeClass ''', 'Cannot find matching method java.lang.Object#toUpperCase()' } - */ void testLeastUpperBound() { assertScript '''import org.codehaus.groovy.ast.ClassHelper http://git-wip-us.apache.org/repos/asf/groovy/blob/49f9111b/src/test/groovy/bugs/Groovy8355Bug.groovy ---------------------------------------------------------------------- diff --git a/src/test/groovy/bugs/Groovy8355Bug.groovy b/src/test/groovy/bugs/Groovy8355Bug.groovy deleted file mode 100644 index b512249..0000000 --- a/src/test/groovy/bugs/Groovy8355Bug.groovy +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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 groovy.bugs - -class Groovy8355Bug extends GroovyTestCase { - void testGroovy8355() { - assertScript ''' - import groovy.transform.CompileStatic - - @CompileStatic - class Foo { - Object str = new Object() - def bar() { - str = "str" - str.toUpperCase() - } - } - - assert "STR" == new Foo().bar() - ''' - } - - void test2() { - assertScript ''' - import groovy.transform.CompileStatic - - @CompileStatic - class Foo { - Object str = new Object() - def bar() { - str = "str" - str.toUpperCase() - } - - def bar2() { - str = 1 - str + 2 - } - } - - Foo foo = new Foo() - assert "STR" == foo.bar() - assert 3 == foo.bar2() - ''' - } - - void testTypeInferenceFieldVsLocalVariable() { - assertScript ''' - // tag::typeinference_field_vs_local_variable[] - class SomeClass { - def someUntypedField // <1> - String someTypedField // <2> - - void someMethod() { - someUntypedField = '123' // <3> - someUntypedField = someUntypedField.toUpperCase() // compile-time error // <4> - } - - void someSafeMethod() { - someTypedField = '123' // <5> - someTypedField = someTypedField.toUpperCase() // <6> - } - - void someMethodUsingLocalVariable() { - def localVariable = '123' // <7> - someUntypedField = localVariable.toUpperCase() // <8> - } - } - // end::typeinference_field_vs_local_variable[] - SomeClass - ''' - } - - /* - void test3() { - assertScript ''' - import groovy.transform.CompileStatic - - @CompileStatic - class Foo { - Object str = "str" - def bar() { - str.toUpperCase() - } - } - - assert "STR" == new Foo().bar() - ''' - } - */ -}