Bug 455478 - FormData generation: error with Table Template with Generic
parameter.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=455478
Fix for missing type parameter in declaring sub hierarchy.
diff --git a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
index 4d0d808..a89c642 100644
--- a/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
+++ b/org.eclipse.scout.sdk.test/src/org/eclipse/scout/sdk/internal/test/util/signature/SignatureUtilityTest.java
@@ -256,7 +256,7 @@
String templateUse = "signature.tests.generic.context.TemplateUse.ConcreteTemplateUse";
IType concreteClass = TypeUtility.getType(templateUse);
- Deque<IType> declaringTypesWithParameters = ScoutTypeUtility.getDeclaringTypesWithSuperTypeParams(concreteClass);
+ Deque<IType> declaringTypesWithParameters = ScoutTypeUtility.getDeclaringTypes(concreteClass);
Assert.assertEquals(2, declaringTypesWithParameters.size());
String resolvedParamSig = SignatureUtility.resolveTypeParameter(innerTemplateClass, null, IRuntimeClasses.IColumn, IRuntimeClasses.TYPE_PARAM_COLUMN_VALUE_TYPE, declaringTypesWithParameters);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
index 9ace197..6d69e8e 100644
--- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
+++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/workspace/type/ScoutTypeUtility.java
@@ -833,19 +833,23 @@
return null;
}
- public static Deque<IType> getDeclaringTypesWithSuperTypeParams(IType startType) throws JavaModelException {
+ /**
+ * Gets all declaring types of the given start type until a static type is found or there is no declaring type
+ * anymore.
+ *
+ * @param startType
+ * The type to start (inclusive)
+ * @return A {@link Deque} containing all declaring types of the given type. The given type itself is always part of
+ * the result.
+ * @throws JavaModelException
+ */
+ public static Deque<IType> getDeclaringTypes(IType startType) throws JavaModelException {
Deque<IType> result = new LinkedList<IType>();
IType t = startType;
while (TypeUtility.exists(t)) {
+ result.add(t);
if (Flags.isStatic(t.getFlags())) {
- break; // cancel on static declaring types
- }
- String superclassTypeSignature = t.getSuperclassTypeSignature();
- if (superclassTypeSignature != null) {
- String[] typeArguments = Signature.getTypeArguments(superclassTypeSignature);
- if (typeArguments.length > 0) {
- result.add(t);
- }
+ return result; // cancel on static declaring types
}
t = t.getDeclaringType();
}
@@ -859,8 +863,8 @@
String columnValueTypeSig = SignatureUtility.resolveTypeParameter(column, columnHierarchy, IRuntimeClasses.IColumn, IRuntimeClasses.TYPE_PARAM_COLUMN_VALUE_TYPE);
if (columnValueTypeSig != null && TypeUtility.exists(lowestLevelColumnContainer) && Signature.getTypeSignatureKind(columnValueTypeSig) == Signature.TYPE_VARIABLE_SIGNATURE) {
- // it resolved to a type variable. it must have been defined in a declaring type -> try to resolve with context
- Deque<IType> declaringContextInToOut = getDeclaringTypesWithSuperTypeParams(lowestLevelColumnContainer);
+ // it resolved to a type variable. it must have been defined in a declaring type -> try to resolve with declaring context
+ Deque<IType> declaringContextInToOut = getDeclaringTypes(lowestLevelColumnContainer);
columnValueTypeSig = SignatureUtility.resolveTypeParameter(column, columnHierarchy, IRuntimeClasses.IColumn, IRuntimeClasses.TYPE_PARAM_COLUMN_VALUE_TYPE, declaringContextInToOut);
}
return columnValueTypeSig;