From a37229029035c7621d8b260ae4306a53435e0452 Mon Sep 17 00:00:00 2001 From: Dirk Mahler Date: Fri, 4 Jun 2021 12:59:04 +0200 Subject: [PATCH] #32 added IT for parameter declarations on inner classes --- .../generics/ParameterizedTypeDescriptor.java | 6 ++++ .../generics/AbstractBoundVisitor.java | 19 +++++++----- .../test/scanner/generics/JavaGenericsIT.java | 31 +++++++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/ParameterizedTypeDescriptor.java b/src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/ParameterizedTypeDescriptor.java index ce41233..41c76da 100644 --- a/src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/ParameterizedTypeDescriptor.java +++ b/src/main/java/com/buschmais/jqassistant/plugin/java/api/model/generics/ParameterizedTypeDescriptor.java @@ -2,6 +2,9 @@ import java.util.List; +import com.buschmais.xo.api.annotation.ResultOf; +import com.buschmais.xo.api.annotation.ResultOf.Parameter; +import com.buschmais.xo.neo4j.api.annotation.Cypher; import com.buschmais.xo.neo4j.api.annotation.Label; import com.buschmais.xo.neo4j.api.annotation.Relation; import com.buschmais.xo.neo4j.api.annotation.Relation.Outgoing; @@ -13,4 +16,7 @@ public interface ParameterizedTypeDescriptor extends BoundDescriptor { @Relation List getActualTypeArguments(); + @ResultOf + @Cypher("MATCH (parameterizedType),(typeArgument) WHERE id(parameterizedType)=$this and id(typeArgument)=$typeArgument MERGE (parameterizedType)-[:HAS_ACTUAL_TYPE_ARGUMENT{index:$index}]->(typeArgument)") + void addActualTypeArgument(@Parameter("index") int index, @Parameter("typeArgument") BoundDescriptor typeArgument); } diff --git a/src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/AbstractBoundVisitor.java b/src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/AbstractBoundVisitor.java index 1479a8e..a5f4426 100644 --- a/src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/AbstractBoundVisitor.java +++ b/src/main/java/com/buschmais/jqassistant/plugin/java/impl/scanner/visitor/generics/AbstractBoundVisitor.java @@ -4,7 +4,11 @@ import com.buschmais.jqassistant.plugin.java.api.model.ClassFileDescriptor; import com.buschmais.jqassistant.plugin.java.api.model.TypeDescriptor; -import com.buschmais.jqassistant.plugin.java.api.model.generics.*; +import com.buschmais.jqassistant.plugin.java.api.model.generics.BoundDescriptor; +import com.buschmais.jqassistant.plugin.java.api.model.generics.GenericArrayTypeDescriptor; +import com.buschmais.jqassistant.plugin.java.api.model.generics.ParameterizedTypeDescriptor; +import com.buschmais.jqassistant.plugin.java.api.model.generics.TypeVariableDescriptor; +import com.buschmais.jqassistant.plugin.java.api.model.generics.WildcardTypeDescriptor; import com.buschmais.jqassistant.plugin.java.api.scanner.SignatureHelper; import com.buschmais.jqassistant.plugin.java.api.scanner.TypeCache; import com.buschmais.jqassistant.plugin.java.impl.scanner.visitor.VisitorHelper; @@ -79,6 +83,7 @@ protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { @Override public final void visitTypeArgument() { + System.out.println("test"); } @Override @@ -88,16 +93,12 @@ public final SignatureVisitor visitTypeArgument(char wildcard) { return new AbstractBoundVisitor(visitorHelper, containingType) { @Override protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { - HasActualTypeArgumentDescriptor hasActualTypeArgument = visitorHelper.getStore().create(parameterizedType, - HasActualTypeArgumentDescriptor.class, bound); - hasActualTypeArgument.setIndex(currentTypeParameterIndex++); + addActualArgumentType(parameterizedType, bound); } }; } else { WildcardTypeDescriptor wildcardType = visitorHelper.getStore().create(WildcardTypeDescriptor.class); - HasActualTypeArgumentDescriptor hasActualTypeArgument = visitorHelper.getStore().create(parameterizedType, HasActualTypeArgumentDescriptor.class, - wildcardType); - hasActualTypeArgument.setIndex(currentTypeParameterIndex++); + addActualArgumentType(parameterizedType, wildcardType); return new AbstractBoundVisitor(visitorHelper, containingType) { @Override protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { @@ -114,6 +115,10 @@ protected void apply(TypeDescriptor rawTypeBound, BoundDescriptor bound) { } } + private void addActualArgumentType(ParameterizedTypeDescriptor parameterizedType, BoundDescriptor argumentType) { + parameterizedType.addActualTypeArgument(currentTypeParameterIndex++, argumentType); + } + private void apply(BoundDescriptor bound) { TypeDescriptor rawType = getRawTypeBound(bound); apply(rawType != null ? rawType : visitorHelper.resolveType(DEFAULT_RAW_TYPE_BOUND, containingType).getTypeDescriptor(), bound); diff --git a/src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/generics/JavaGenericsIT.java b/src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/generics/JavaGenericsIT.java index 1b12931..e8a81e0 100644 --- a/src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/generics/JavaGenericsIT.java +++ b/src/test/java/com/buschmais/jqassistant/plugin/java/test/scanner/generics/JavaGenericsIT.java @@ -1,7 +1,11 @@ package com.buschmais.jqassistant.plugin.java.test.scanner.generics; import java.io.Serializable; -import java.lang.reflect.*; +import java.lang.reflect.GenericArrayType; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; +import java.lang.reflect.WildcardType; import java.util.AbstractList; import java.util.List; import java.util.Map; @@ -59,6 +63,30 @@ void outerClassTypeParameters() { store.commitTransaction(); } + @Test + void innerClassTypeParameters() { + scanClasses(GenericTypeDeclarations.Inner.class); + store.beginTransaction(); + List declaredTypeParameters = query( + "MATCH (:Type:GenericDeclaration{name:'GenericTypeDeclarations$Inner'})-[declares:DECLARES_TYPE_PARAMETER]->(typeParameter:Java:ByteCode:Bound:TypeVariable) " + + // + "RETURN typeParameter ORDER BY declares.index").getColumn("typeParameter"); + assertThat(declaredTypeParameters).hasSize(1); + TypeVariableDescriptor x = declaredTypeParameters.get(0); + assertThat(x.getName().equals("X")); + List xBounds = x.getBounds(); + assertThat(xBounds.size()).isEqualTo(1); + assertThat(xBounds.get(0).getRawType()).is(matching(typeDescriptor(Object.class))); + List requiredTypeParameters = query( + "MATCH (:Type:GenericDeclaration{name:'GenericTypeDeclarations$Inner'})-[declares:REQUIRES_TYPE_PARAMETER]->(typeParameter:Java:ByteCode:Bound:TypeVariable) " + + // + "RETURN typeParameter").getColumn("typeParameter"); + assertThat(requiredTypeParameters).hasSize(1); + TypeVariableDescriptor y = declaredTypeParameters.get(0); + assertThat(y.getName().equals("Y")); + store.commitTransaction(); + } + @Test void implementsGeneric() { evaluate("genericInterfaces", ImplementsGeneric.class.getGenericInterfaces(), 0); @@ -105,7 +133,6 @@ void fieldOfTypeVariable() { store.commitTransaction(); } - @TestStore(type = TestStore.Type.REMOTE) @Test void fieldOfParameterizedType() { scanClasses(GenericFields.class);