From 9bd923108f4b29f2cc2483356eb003bfb8cf315d Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Tue, 19 Feb 2019 14:34:08 -0600 Subject: [PATCH] Fix for #815: restore type confidence of private trait method reference --- .../tests/search/TraitInferencingTests.java | 56 ++++++++++++++++++- .../jdt/groovy/search/SimpleTypeLookup.java | 2 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/TraitInferencingTests.java b/base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/TraitInferencingTests.java index 156447b21f..f0ddf57d84 100644 --- a/base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/TraitInferencingTests.java +++ b/base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/TraitInferencingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2009-2018 the original author or authors. + * Copyright 2009-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,6 +91,60 @@ public void testPrivateMethod() { assertExprType(source, "check", "java.lang.Boolean"); } + @Test + public void testPrivateMethod2() { + String contents = + "trait A {\n" + + " private void method() {}\n" + + "}\n" + + "trait B {\n" + + " private void method() {}\n" + + "}\n" + + "class C implements A, B {\n" + + " void something() {\n" + + " method()\n" + + " }\n" + + "}"; + assertDeclType(contents, "method", "A"); + assertExprType(contents, "method", "java.lang.Void"); + } + + @Test + public void testPrivateMethod3() { + String contents = + "trait A {\n" + + " private void method() {}\n" + + "}\n" + + "trait B {\n" + + " private void method() {}\n" + + "}\n" + + "class C implements A, B {\n" + + " void something() {\n" + + " A.super.method()\n" + + " }\n" + + "}"; + assertDeclType(contents, "method", "A$Trait$Helper"); + assertExprType(contents, "method", "java.lang.Void"); + } + + @Test + public void testPrivateMethod4() { + String contents = + "trait A {\n" + + " private void method() {}\n" + + "}\n" + + "trait B {\n" + + " private void method() {}\n" + + "}\n" + + "class C implements A, B {\n" + + " void something() {\n" + + " B.super.method()\n" + + " }\n" + + "}"; + assertDeclType(contents, "method", "B$Trait$Helper"); + assertExprType(contents, "method", "java.lang.Void"); + } + @Test // https://issues.apache.org/jira/browse/GROOVY-8854 public void testPrivateStaticMethod() { String source = diff --git a/base/org.eclipse.jdt.groovy.core/src/org/eclipse/jdt/groovy/search/SimpleTypeLookup.java b/base/org.eclipse.jdt.groovy.core/src/org/eclipse/jdt/groovy/search/SimpleTypeLookup.java index 1c66a4778e..914e5e0f29 100644 --- a/base/org.eclipse.jdt.groovy.core/src/org/eclipse/jdt/groovy/search/SimpleTypeLookup.java +++ b/base/org.eclipse.jdt.groovy.core/src/org/eclipse/jdt/groovy/search/SimpleTypeLookup.java @@ -954,7 +954,7 @@ protected static boolean isCompatible(final AnnotatedNode declaration, final boo } protected static boolean isNotThisOrOuterClass(final ClassNode thisType, final ClassNode declaringClass) { - return (!thisType.equals(declaringClass) && !thisType.getOuterClasses().contains(declaringClass)); + return (!thisType.equals(declaringClass) && !thisType.getOuterClasses().contains(declaringClass) && !(implementsTrait(thisType) && thisType.implementsInterface(declaringClass))); } /**