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);