Computation of Column and ValueField datatypes fixed. Change-Id: I563e3753fe49c5d81b148b1366d31bfef2e6b023 Reviewed-on: https://git.eclipse.org/r/22404 Tested-by: Hudson CI Reviewed-by: Matthias Villiger <mvi@bsiag.com> IP-Clean: Matthias Villiger <mvi@bsiag.com>
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 eccaa7d..a5ff6c5 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
@@ -4,10 +4,9 @@ package org.eclipse.scout.sdk.internal.test.util.signature; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.Signature; @@ -168,27 +167,27 @@ @Test public void testGenericResolver01() throws Exception { - Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>(); + LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>(); String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass01<" + String.class.getName() + "," + Integer.class.getName() + ">", true); - SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector); + SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector); Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC")); Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A")); } @Test public void testGenericResolver02() throws Exception { - Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>(); + LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>(); String superTypeSignature = Signature.createTypeSignature("signature.tests.generic.AbstractClass02<" + Integer.class.getName() + ">", true); - SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector); + SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector); Assert.assertEquals(Signature.createTypeSignature(String.class.getName(), true), collector.get("signature.tests.generic.IInterface01").getParameterSignature("GENERIC")); Assert.assertEquals(Signature.createTypeSignature(List.class.getName() + "<" + Integer.class.getName() + ">", true), collector.get("signature.tests.generic.IInterface02").getParameterSignature("A")); } @Test public void testGenericResolver03() throws Exception { - Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>(); + LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>(); String superTypeSignature = Signature.createTypeSignature("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField<" + Integer.class.getName() + ">", true); - SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), null, superTypeSignature, null, collector); + SignatureUtility.resolveGenericParametersInSuperHierarchy(Signature.createTypeSignature("signature.tests.generic.output.TestType", true), superTypeSignature, null, collector); Assert.assertEquals(Signature.createTypeSignature(Integer.class.getName(), true), collector.get("org.eclipse.scout.rt.client.ui.form.fields.smartfield.AbstractSmartField").getParameterSignature("T")); }
diff --git a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java index 3819418..2c96a9f 100644 --- a/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java +++ b/org.eclipse.scout.sdk.testing/src/org/eclipse/scout/sdk/testing/codegen/ApiTestGenerator.java
@@ -40,7 +40,7 @@ /** * <h3>{@link ApiTestGenerator}</h3> * - * @author Andreas Hoegger + * @author Andreas Hoegger * @since 3.10.0 26.08.2013 */ public class ApiTestGenerator { @@ -256,7 +256,7 @@ try { for (IAnnotation a : annotatable.getAnnotations()) { String annotationSignature = SignatureUtility.getResolvedSignature(Signature.createTypeSignature(a.getElementName(), false), resolveContext); - source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQuallifiedName(annotationSignature)).append("\");").append(NL); + source.append(sdkAssertRef).append(".assertAnnotation(").append(annotatableRef).append(", \"").append(SignatureUtility.getFullyQualifiedName(annotationSignature)).append("\");").append(NL); } } catch (CoreException e) {
diff --git a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java index 084f641..f123860 100644 --- a/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java +++ b/org.eclipse.scout.sdk.ui/src/org/eclipse/scout/sdk/ui/services/JavaElementCommentBuilderService.java
@@ -62,7 +62,7 @@ /** * <h3>{@link JavaElementCommentBuilderService}</h3> * - * @author Andreas Hoegger + * @author Andreas Hoegger * @since 3.10.0 12.07.2013 */ @SuppressWarnings("restriction") @@ -224,9 +224,9 @@ seeBuilder.append(interfaceFqn).append("#").append(methodSourceBuilder.getElementName()).append("("); Iterator<MethodParameter> parameterIterator = methodSourceBuilder.getParameters().iterator(); if (parameterIterator.hasNext()) { - seeBuilder.append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature())); + seeBuilder.append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature())); while (parameterIterator.hasNext()) { - seeBuilder.append(", ").append(SignatureUtility.getFullyQuallifiedName(parameterIterator.next().getSignature())); + seeBuilder.append(", ").append(SignatureUtility.getFullyQualifiedName(parameterIterator.next().getSignature())); } } seeBuilder.append(")");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java index 40b8d8f..3963742 100644 --- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java +++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/ITypeGenericMapping.java
@@ -13,26 +13,32 @@ import java.util.Map; /** - * <h3>{@link ITypeGenericMapping}</h3> ... + * <h3>{@link ITypeGenericMapping}</h3> * - * @author Andreas Hoegger + * @author Andreas Hoegger * @since 3.9.0 04.04.2013 */ public interface ITypeGenericMapping { /** - * @return + * @return The fully qualified name of the class the generic mappings belong to. */ - String getFullyQuallifiedName(); + String getFullyQualifiedName(); /** + * Gets the signature of the generic parameter with the given name. + * * @param paramName - * @return + * The name of the generic parameter (e.g. "T" or "VALUE_TYPE") + * @return The signature of the generic type with the given name or null if the class that belongs to this instance + * does not define a generic type with the given name. */ String getParameterSignature(String paramName); /** - * @return + * Gets a unmodifiable map of all generic types with their corresponding signature. + * + * @return The generic type to signature mapping. */ Map<String, String> getParameters();
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java index 085d034..038f140 100644 --- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java +++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/SignatureUtility.java
@@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -26,11 +27,11 @@ public final class SignatureUtility { - private final static Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$"); - private final static Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}"); - public final static Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$"); - private final static Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$"); - private final static Pattern SIG_END = Pattern.compile("(^.*)\\;$"); + private static final Pattern QUALIFIED_SIG_REGEX = Pattern.compile("^([\\+\\[]*)([^\\<\\(\\;]*)(.*)$"); + private static final Pattern SIG_REPLACEMENT_REGEX = Pattern.compile("[\\.\\$]{1}"); + private static final Pattern PARAM_SIG_REPLACEMENT_REGEX = Pattern.compile("^([^\\:]*)\\:(.*)$"); + private static final Pattern SIG_END = Pattern.compile("(^.*)\\;$"); + public static final Pattern DOLLAR_REPLACEMENT_REGEX = Pattern.compile("\\$"); /** * Character constant indicating an arbitrary array type in a signature. @@ -49,6 +50,36 @@ private SignatureUtility() { } + public static String unboxPrimitiveSignature(String signature) { + if (Signature.getTypeSignatureKind(signature) == Signature.BASE_TYPE_SIGNATURE) { + if (Signature.SIG_BOOLEAN.equals(signature)) { + signature = SignatureCache.createTypeSignature(Boolean.class.getName()); + } + else if (Signature.SIG_BYTE.equals(signature)) { + signature = SignatureCache.createTypeSignature(Byte.class.getName()); + } + else if (Signature.SIG_CHAR.equals(signature)) { + signature = SignatureCache.createTypeSignature(Character.class.getName()); + } + else if (Signature.SIG_DOUBLE.equals(signature)) { + signature = SignatureCache.createTypeSignature(Double.class.getName()); + } + else if (Signature.SIG_FLOAT.equals(signature)) { + signature = SignatureCache.createTypeSignature(Float.class.getName()); + } + else if (Signature.SIG_INT.equals(signature)) { + signature = SignatureCache.createTypeSignature(Integer.class.getName()); + } + else if (Signature.SIG_LONG.equals(signature)) { + signature = SignatureCache.createTypeSignature(Long.class.getName()); + } + else if (Signature.SIG_SHORT.equals(signature)) { + signature = SignatureCache.createTypeSignature(Short.class.getName()); + } + } + return signature; + } + /** * To get the signature kind of the given signature. If a signature starts with '|' it is a arbitrary array signature * otherwise see {@link Signature#getTypeSignatureKind(String)}. @@ -66,8 +97,6 @@ return ARBITRARY_ARRAY_SIGNATURE; } else { - //private final static Pattern SIMPLE_NAME_REGEX = Pattern.compile("^[\\[]*([^\\<]*).*(\\;)$"); - // signature = SIMPLE_NAME_REGEX.matcher(signature).replaceAll("$1$2"); return Signature.getTypeSignatureKind(signature); } } @@ -105,7 +134,7 @@ public static String getResolvedSignature(String signature, IType signatureOwner, IType contextType) throws CoreException { Map<String, String> genericParameters = null; if (TypeUtility.exists(contextType) && TypeUtility.exists(signatureOwner)) { - Map<String, ITypeGenericMapping> collector = new HashMap<String, ITypeGenericMapping>(); + LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>(); resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), collector); ITypeGenericMapping mapping = collector.get(signatureOwner.getFullyQualifiedName()); if (mapping != null) { @@ -134,7 +163,7 @@ * To get the simple type reference name within a context represented by the given importValidator. Every fully * qualified type name will be passed to the importValidator to decide if the import is already in use. * - * @param fullyQuallifiedTypeName + * @param fullyQualifiedTypeName * e.g. java.lang.String (not a signature). * @param importValidator * to evaluate all fully qualified names for create an import and use simple names. @@ -150,14 +179,6 @@ * @throws CoreException * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)} */ - public static String getTypeReference(String signature) throws CoreException { - return getTypeReference(signature, null, null, new FullyQuallifiedValidator()); - } - - /** - * @throws CoreException - * @see {@link ScoutSignature#getTypeReference(String, IType, IType, IImportValidator)} - */ public static String getTypeReference(String signature, IImportValidator importValidator) throws CoreException { return getTypeReference(signature, null, null, importValidator); } @@ -172,9 +193,9 @@ /** * <h4>Examples</h4> <xmp> - * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQuallifiedImpValidator) + * getTypeReferenceImpl("Ljava.lang.String;", typeA, typeA, fullyQualifiedImpValidator) * -> java.lang.String - * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQuallifiedImpValidator) + * getTypeReferenceImpl("QList<?QString>;", typeA, typeA, fullyQualifiedImpValidator) * -> java.util.List<? extends java.lang.String> * </xmp> * @@ -190,7 +211,7 @@ * an import validator to decide simple name vs. fully qualified name. * @return the type reference * @throws CoreException - * @see {@link FullyQuallifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator} + * @see {@link FullyQualifiedValidator}, {@link IImportValidator}, {@link SimpleImportValidator} */ private static String getTypeReference(String signature, IType signatureOwner, IType contextType, IImportValidator validator) throws CoreException { StringBuilder sigBuilder = new StringBuilder(); @@ -291,7 +312,7 @@ * @throws CoreException */ public static String[] getMethodParameterSignatureResolved(IMethod jdtMethod, IType contextType) throws CoreException { - Map<String, ITypeGenericMapping> genericMapperCollector = new HashMap<String, ITypeGenericMapping>(); + LinkedHashMap<String, ITypeGenericMapping> genericMapperCollector = new LinkedHashMap<String, ITypeGenericMapping>(); resolveGenericParametersInSuperHierarchy(contextType, new String[0], contextType.newSupertypeHierarchy(new NullProgressMonitor()), genericMapperCollector); ITypeGenericMapping mapping = genericMapperCollector.get(jdtMethod.getDeclaringType().getFullyQualifiedName()); Map<String, String> parameters = null; @@ -359,12 +380,11 @@ return returnTypeSignature; } - public static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException { + private static String ensureSourceTypeParametersAreCorrect(String signature, IType signatureOwner) throws JavaModelException { if (!TypeUtility.exists(signatureOwner) || signatureOwner.isBinary()) { return signature; } else { - ITypeParameter[] typeParameters = signatureOwner.getTypeParameters(); if (typeParameters != null && typeParameters.length > 0) { for (ITypeParameter tp : typeParameters) { @@ -382,38 +402,14 @@ * 'methodname(param1Signature,param2Signature)'. * * @param method - * @return an unique method identifier of the given method - * @throws CoreException - */ - public static String getMethodIdentifier(IMethod method) throws CoreException { - StringBuilder methodIdBuilder = new StringBuilder(method.getElementName()); - methodIdBuilder.append("("); - String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method); - for (int i = 0; i < resolvedParamSignatures.length; i++) { - methodIdBuilder.append(resolvedParamSignatures[i]); - if (i + 1 < resolvedParamSignatures.length) { - methodIdBuilder.append(","); - } - } - methodIdBuilder.append(")"); - return methodIdBuilder.toString(); - } - - /** - * returns a unique identifier of a scout method. The identifier looks like - * 'methodname(param1Signature,param2Signature)'. - * - * @param method - * @param contextType - * the type in what context the method appears, used for generic bindings. * @return * @throws CoreException */ - public static String getMethodIdentifier(IMethod method, IType contextType) throws CoreException { + public static String getMethodIdentifier(IMethod method) throws CoreException { StringBuilder methodIdBuilder = new StringBuilder(); methodIdBuilder.append(method.getElementName()); methodIdBuilder.append("("); - String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, contextType); + String[] resolvedParamSignatures = getMethodParameterSignatureResolved(method, method.getDeclaringType()); for (int i = 0; i < resolvedParamSignatures.length; i++) { methodIdBuilder.append(resolvedParamSignatures[i]); if (i + 1 < resolvedParamSignatures.length) { @@ -467,7 +463,6 @@ String[] superClassParameterSignatures = Signature.getTypeArguments(superClassSignature); if (superClassParameterSignatures.length < parameterIndex + 1) { return SignatureCache.createTypeSignature(Object.class.getName()); - // throw new IllegalArgumentException("Lost parameter '" + typeParameterSignature + "' in hierarchy at '" + hType.getFullyQualifiedName() + "'."); } else { // translate @@ -478,7 +473,13 @@ return typeParameterSignature; } - public static String getFullyQuallifiedName(String signature) { + /** + * Gets the fully qualified name of the given signature. + * + * @param signature + * @return The fully qualified name of the given signature. + */ + public static String getFullyQualifiedName(String signature) { signature = Signature.getTypeErasure(signature); int arrayCount = Signature.getArrayCount(signature); if (arrayCount > 0) { @@ -488,6 +489,13 @@ return fqn; } + /** + * Checks if the given signature contains type arguments. + * + * @param sig + * The signature to check + * @return true if the given signature has type arguments, false otherwise. + */ public static boolean isGenericSignature(String sig) { String[] params = Signature.getTypeArguments(sig); return params != null && params.length > 0; @@ -504,7 +512,7 @@ String simpleSignature = m.group(2); String postfix = m.group(3); if (startsWith(simpleSignature, Signature.C_UNRESOLVED)) { - String simpleName = Signature.getSignatureSimpleName(simpleSignature + ";"); + String simpleName = Signature.getSignatureSimpleName(simpleSignature + Signature.C_SEMICOLON); String referencedTypeSignature = getReferencedTypeSignature(jdtType, simpleName, false); if (referencedTypeSignature != null) { simpleSignature = SIG_END.matcher(referencedTypeSignature).replaceAll("$1"); @@ -524,7 +532,11 @@ } } - public static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException { + public static void resolveGenericParametersInSuperHierarchy(String signature, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException { + resolveGenericParametersInSuperHierarchy(signature, new String[0], superTypeSignature, interfaceSignatures, collector); + } + + private static void resolveGenericParametersInSuperHierarchy(String signature, String[] parameterSignatures, String superTypeSignature, String[] interfaceSignatures, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException { TypeGenericMapping typeDesc = new TypeGenericMapping(Signature.getSignatureQualifier(signature) + "." + Signature.getSignatureSimpleName(signature)); String[] localParameterSignatures = Signature.getTypeParameters(signature); if (localParameterSignatures.length > 0) { @@ -532,7 +544,7 @@ typeDesc.addParameter(Signature.getSignatureSimpleName(localParameterSignatures[i]), parameterSignatures[i]); } } - collector.put(typeDesc.getFullyQuallifiedName(), typeDesc); + collector.put(typeDesc.getFullyQualifiedName(), typeDesc); // super type if (superTypeSignature != null) { @@ -568,24 +580,51 @@ } } } - } - public static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, Map<String/*fullyQuallifiedName*/, ITypeGenericMapping> collector) throws CoreException { + public static String resolveGenericParameterInSuperHierarchy(IType startType, ITypeHierarchy superHierarchy, String genericDefiningSuperTypeFqn, String paramName) throws CoreException { + LinkedHashMap<String, ITypeGenericMapping> collector = new LinkedHashMap<String, ITypeGenericMapping>(); + resolveGenericParametersInSuperHierarchy(startType, new String[]{}, superHierarchy, collector); + ITypeGenericMapping genericMapping = collector.get(genericDefiningSuperTypeFqn); + if (genericMapping != null) { + return genericMapping.getParameterSignature(paramName); + } + return null; + } + + public static void resolveGenericParametersInSuperHierarchy(IType type, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException { + resolveGenericParametersInSuperHierarchy(type, new String[]{}, hierarchy, collector); + } + + private static void resolveGenericParametersInSuperHierarchy(IType type, String[] parameterSignatures, ITypeHierarchy hierarchy, LinkedHashMap<String/*fullyQualifiedName*/, ITypeGenericMapping> collector) throws CoreException { if (!TypeUtility.exists(type)) { return; } TypeGenericMapping typeDesc = new TypeGenericMapping(type.getFullyQualifiedName()); ITypeParameter[] typeParameters = type.getTypeParameters(); + HashMap<String, String> paramsUnresolved = new HashMap<String, String>(typeParameters.length); + for (ITypeParameter par : typeParameters) { + String[] boundsSignatures = par.getBoundsSignatures(); + if (boundsSignatures != null && boundsSignatures.length > 0) { + paramsUnresolved.put(par.getElementName(), par.getBoundsSignatures()[0]); + } + } + for (int i = 0; i < typeParameters.length; i++) { if (parameterSignatures.length > i) { typeDesc.addParameter(typeParameters[i].getElementName(), parameterSignatures[i]); } else { - typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName())); + String[] boundsSignatures = typeParameters[i].getBoundsSignatures(); + if (boundsSignatures != null && boundsSignatures.length > 0) { + typeDesc.addParameter(typeParameters[i].getElementName(), getResolvedSignature(type, paramsUnresolved, boundsSignatures[0])); + } + else { + typeDesc.addParameter(typeParameters[i].getElementName(), SignatureCache.createTypeSignature(Object.class.getName())); + } } } - collector.put(typeDesc.getFullyQuallifiedName(), typeDesc); + collector.put(typeDesc.getFullyQualifiedName(), typeDesc); // super class if (!Flags.isInterface(type.getFlags())) { String superclassTypeSignature = type.getSuperclassTypeSignature(); @@ -653,10 +692,16 @@ case Signature.TYPE_VARIABLE_SIGNATURE: // try to resolve type String sig = parameterSignatures.get(Signature.getSignatureSimpleName(unresolvedSignature)); + if (startsWith(sig, Signature.C_UNRESOLVED) && TypeUtility.exists(contextType)) { + String simpleName = Signature.getSignatureSimpleName(sig); + String referencedTypeSignature = getReferencedTypeSignature(contextType, simpleName, false); + if (referencedTypeSignature != null) { + sig = referencedTypeSignature; + } + } sigBuilder.append(sig); break; case Signature.CLASS_TYPE_SIGNATURE: - String[] typeArguments = Signature.getTypeArguments(unresolvedSignature); unresolvedSignature = Signature.getTypeErasure(unresolvedSignature); unresolvedSignature = SIG_REPLACEMENT_REGEX.matcher(unresolvedSignature).replaceAll(".");
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java index cb806dd..6fa9aff 100644 --- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java +++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/signature/internal/TypeGenericMapping.java
@@ -11,7 +11,8 @@ package org.eclipse.scout.sdk.util.signature.internal; import java.util.Collections; -import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -20,22 +21,22 @@ /** * <h3>{@link TypeGenericMapping}</h3> ... * - * @author Andreas Hoegger + * @author Andreas Hoegger * @since 3.9.0 20.03.2013 */ public class TypeGenericMapping implements ITypeGenericMapping { - private final String m_fullyQuallifiedName; - private Map<String /*parameter name*/, String /*param signature*/> m_parameters; + private final String m_fullyQualifiedName; + private final Map<String /*parameter name*/, String /*param signature*/> m_parameters; public TypeGenericMapping(String fullyQualliefiedName) { - m_fullyQuallifiedName = fullyQualliefiedName; - m_parameters = new HashMap<String, String>(); + m_fullyQualifiedName = fullyQualliefiedName; + m_parameters = new LinkedHashMap<String, String>(); } @Override - public String getFullyQuallifiedName() { - return m_fullyQuallifiedName; + public String getFullyQualifiedName() { + return m_fullyQualifiedName; } public void addParameter(String name, String signature) { @@ -54,10 +55,18 @@ @Override public String toString() { - StringBuilder builder = new StringBuilder(getFullyQuallifiedName()); - for (Entry<String, String> e : m_parameters.entrySet()) { - builder.append("\n ").append(e.getKey()).append(" -> ").append(e.getValue()); + StringBuilder builder = new StringBuilder(getFullyQualifiedName()); + builder.append('{'); + if (!m_parameters.isEmpty()) { + Iterator<Entry<String, String>> iterator = m_parameters.entrySet().iterator(); + Entry<String, String> e = iterator.next(); + builder.append(e.getKey()).append(" -> ").append(e.getValue()); + while (iterator.hasNext()) { + e = iterator.next(); + builder.append(" | ").append(e.getKey()).append(" -> ").append(e.getValue()); + } } + builder.append('}'); return builder.toString(); } }
diff --git a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java index d00be11..4088fc8 100644 --- a/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java +++ b/org.eclipse.scout.sdk.util/src/org/eclipse/scout/sdk/util/type/TypeUtility.java
@@ -246,7 +246,7 @@ if (signature == null) { return null; } - return getType(SignatureUtility.getFullyQuallifiedName(signature)); + return getType(SignatureUtility.getFullyQualifiedName(signature)); } /**
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java index 8642644..1151acb 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/internal/workspace/dto/AbstractTableSourceBuilder.java
@@ -14,6 +14,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.Signature; +import org.eclipse.scout.sdk.extensions.runtime.classes.IRuntimeClasses; import org.eclipse.scout.sdk.util.signature.SignatureUtility; import org.eclipse.scout.sdk.util.type.TypeUtility; import org.eclipse.scout.sdk.util.typecache.ITypeHierarchy; @@ -36,9 +37,17 @@ } protected String getColumnSignature(IType type, ITypeHierarchy columnHierarchy) throws IllegalArgumentException, CoreException { - if (type == null || Object.class.getName().equals(type.getFullyQualifiedName())) { + if (!TypeUtility.exists(type) || Object.class.getName().equals(type.getFullyQualifiedName())) { return null; } + + // try IColumn first + String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, columnHierarchy.getJdtHierarchy(), IRuntimeClasses.IColumn, "T"); + if (sig != null) { + return sig; + } + + // try other models IType superType = columnHierarchy.getSuperclass(type); if (TypeUtility.exists(superType)) { if (TypeUtility.isGenericType(superType)) {
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java index 5f74cab..9ceccab 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/WizardStepNewOperation.java
@@ -99,7 +99,7 @@ } // form if (getForm() != null) { - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractWizardStep)) { // update generic in supertype signature StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java index 4e90048..64a6193 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/CalendarFieldNewOperation.java
@@ -84,7 +84,7 @@ nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry())); newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder); } - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractCalendarField)) { // create inner type calendar ITypeSourceBuilder calendarBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_CALENDARFIELD_CALENDAR);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java index 1dc22b3..87008bf 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/PlannerFieldNewOperation.java
@@ -74,7 +74,7 @@ FormFieldNewOperation newOp = new FormFieldNewOperation(getTypeName(), getDeclaringType()); newOp.setSibling(getSibling()); newOp.setSuperTypeSignature(getSuperTypeSignature()); - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractPlannerField)) { // super type sig StringBuilder superTypeSigBuilder = new StringBuilder(superTypeFqn); @@ -134,7 +134,7 @@ ITypeSourceBuilder activityMapBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_PLANNERFIELD_ACTIVITYMAP); activityMapBuilder.setFlags(Flags.AccPublic); String activityMapSuperTypeSig = RuntimeClasses.getSuperTypeSignature(RuntimeClasses.IActivityMap, getDeclaringType().getJavaProject()); - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(activityMapSuperTypeSig); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(activityMapSuperTypeSig); if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractActivityMap) || CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractExtensibleActivityMap)) { // super type sig
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java index 197c8c7..882fd7c 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeBoxNewOperation.java
@@ -81,7 +81,7 @@ nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry())); newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder); } - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeBox)) { // create inner type calendar ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java index 87f8366..a71cd7c 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/TreeFieldNewOperation.java
@@ -84,7 +84,7 @@ nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry())); newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder); } - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); if (CompareUtility.equals(superTypeFqn, IRuntimeClasses.AbstractTreeField)) { // create inner type calendar ITypeSourceBuilder treeBuilder = new TypeSourceBuilder(SdkProperties.TYPE_NAME_TREEBOX_TREE);
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java index 0f8dd9c..78cd566 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/form/field/table/TableFieldNewOperation.java
@@ -85,7 +85,7 @@ nlsMethodBuilder.setMethodBodySourceBuilder(MethodBodySourceBuilderFactory.createNlsEntryReferenceBody(getNlsEntry())); newOp.addSortedMethodSourceBuilder(SortedMemberKeyFactory.createMethodGetConfiguredKey(nlsMethodBuilder), nlsMethodBuilder); } - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); // TODO aho check generic type table!!! if (CompareUtility.equals(superTypeFqn, RuntimeClasses.AbstractTableField)) { // create inner type table
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java index 03289ac..2f65525 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/operation/page/PageNewOperation.java
@@ -84,7 +84,7 @@ @Override public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException { - String superTypeFqn = SignatureUtility.getFullyQuallifiedName(getSuperTypeSignature()); + String superTypeFqn = SignatureUtility.getFullyQualifiedName(getSuperTypeSignature()); PrimaryTypeNewOperation newOp = new PrimaryTypeNewOperation(getTypeName(), getPackageNamePage(), getPageJavaProject()); newOp.setIcuCommentSourceBuilder(CommentSourceBuilderFactory.createPreferencesCompilationUnitCommentBuilder());
diff --git a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java index c48ac2c..376253a 100644 --- a/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java +++ b/org.eclipse.scout.sdk/src/org/eclipse/scout/sdk/sourcebuilder/method/MethodSourceBuilderFactory.java
@@ -10,7 +10,7 @@ ******************************************************************************/ package org.eclipse.scout.sdk.sourcebuilder.method; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -39,7 +39,7 @@ /** * <h3>{@link MethodSourceBuilderFactory}</h3> ... * - * @author Andreas Hoegger + * @author Andreas Hoegger * @since 3.10.0 07.03.2013 */ public final class MethodSourceBuilderFactory { @@ -144,8 +144,8 @@ return null; } else { - Map<String, ITypeGenericMapping> genericMapping = new HashMap<String, ITypeGenericMapping>(); - SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()), new String[0], + LinkedHashMap<String, ITypeGenericMapping> genericMapping = new LinkedHashMap<String, ITypeGenericMapping>(); + SignatureUtility.resolveGenericParametersInSuperHierarchy(SignatureCache.createTypeSignature(typeSourceBuilder.getElementName()), typeSourceBuilder.getSuperTypeSignature(), typeSourceBuilder.getInterfaceSignatures().toArray(new String[typeSourceBuilder.getInterfaceSignatures().size()]), genericMapping); MethodSourceBuilder builder = new MethodSourceBuilder(methodName);
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 20b87b7..2ae6996 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
@@ -976,9 +976,17 @@ } public static String computeFormFieldGenericType(IType type, ITypeHierarchy formFieldHierarchy) throws CoreException { - if (type == null || type.getFullyQualifiedName().equals(Object.class.getName())) { + if (!TypeUtility.exists(type) || type.getFullyQualifiedName().equals(Object.class.getName())) { return null; } + + // try value fields + String sig = SignatureUtility.resolveGenericParameterInSuperHierarchy(type, formFieldHierarchy.getJdtHierarchy(), IRuntimeClasses.IValueField, "T"); + if (sig != null) { + return sig; + } + + // for own models IType superType = formFieldHierarchy.getSuperclass(type); if (TypeUtility.exists(superType)) { if (TypeUtility.isGenericType(superType)) { @@ -1010,7 +1018,7 @@ replacement = Matcher.quoteReplacement(replacement.substring(0, replacement.length() - 1)); signature = signature.replaceAll("[T,L,Q]" + signatureMapping.get(i).getSuperTypeGenericParameterName(), replacement); } - return SignatureUtility.getResolvedSignature(signature, type); + return SignatureUtility.getResolvedSignature(signature, type, type); } else { return computeFormFieldGenericType(superType, formFieldHierarchy);