Skip to content

Commit 044705d

Browse files
committed
JavaExecutable: Change to get TypeVars on-demand instead of ahead of time
JavaField: Changed to get EvalType on-demand instead of ahead of time
1 parent 0066054 commit 044705d

2 files changed

Lines changed: 42 additions & 17 deletions

File tree

‎src/javakit/resolver/JavaExecutable.java‎

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ public JavaExecutable(Resolver aResolver, DeclType aType, JavaClass aDeclaringCl
3333

3434
// Get VarArgs
3535
_varArgs = anExecutable.isVarArgs();
36+
}
3637

37-
// Get TypeVariables
38-
TypeVariable<?>[] typeVars = anExecutable.getTypeParameters();
39-
_typeVars = new JavaTypeVariable[typeVars.length];
40-
for (int i = 0, iMax = typeVars.length; i < iMax; i++)
41-
_typeVars[i] = new JavaTypeVariable(_resolver, this, typeVars[i]);
38+
/**
39+
* Returns the executable.
40+
*/
41+
private Executable getExecutable()
42+
{
43+
return this instanceof JavaMethod ? ((JavaMethod) this).getMethod() : ((JavaConstructor) this).getConstructor();
4244
}
4345

4446
/**
@@ -49,14 +51,28 @@ public JavaExecutable(Resolver aResolver, DeclType aType, JavaClass aDeclaringCl
4951
/**
5052
* Returns the TypeVars.
5153
*/
52-
public JavaTypeVariable[] getTypeVars() { return _typeVars; }
54+
public JavaTypeVariable[] getTypeVars()
55+
{
56+
if (_typeVars != null) return _typeVars;
57+
58+
// Get TypeVariables
59+
Executable executable = getExecutable();
60+
TypeVariable<?>[] typeVars = executable.getTypeParameters();
61+
JavaTypeVariable[] javaTypeVars = new JavaTypeVariable[typeVars.length];
62+
for (int i = 0, iMax = typeVars.length; i < iMax; i++)
63+
javaTypeVars[i] = new JavaTypeVariable(_resolver, this, typeVars[i]);
64+
65+
// Set and return
66+
return _typeVars = javaTypeVars;
67+
}
5368

5469
/**
5570
* Returns the TypeVar with given name.
5671
*/
5772
public JavaTypeVariable getTypeVarForName(String aName)
5873
{
59-
return ArrayUtils.findMatch(_typeVars, tvar -> tvar.getName().equals(aName));
74+
JavaTypeVariable[] typeVars = getTypeVars();
75+
return ArrayUtils.findMatch(typeVars, tvar -> tvar.getName().equals(aName));
6076
}
6177

6278
/**
@@ -85,10 +101,10 @@ public JavaType[] getParameterTypes()
85101
if (_parameterTypes != null) return _parameterTypes;
86102

87103
// Get GenericParameterTypes (this can fail https://bugs.openjdk.java.net/browse/JDK-8075483))
88-
Executable exec = this instanceof JavaMethod ? ((JavaMethod) this).getMethod() : ((JavaConstructor) this).getConstructor();
89-
Type[] paramTypesReal = exec.getGenericParameterTypes();
90-
if (paramTypesReal.length < exec.getParameterCount())
91-
paramTypesReal = exec.getParameterTypes();
104+
Executable executable = getExecutable();
105+
Type[] paramTypesReal = executable.getGenericParameterTypes();
106+
if (paramTypesReal.length < executable.getParameterCount())
107+
paramTypesReal = executable.getParameterTypes();
92108

93109
JavaType[] parameterTypes = _resolver.getJavaTypesForTypes(paramTypesReal);
94110

‎src/javakit/resolver/JavaField.java‎

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ public class JavaField extends JavaMember {
1919
public JavaField(Resolver aResolver, JavaClass aDeclaringClass, Field aField)
2020
{
2121
super(aResolver, DeclType.Field, aDeclaringClass, aField);
22-
if (aField == null) return;
22+
if (aField == null)
23+
return;
2324

2425
// Set field
2526
_field = aField;
26-
27-
// Set EvalType
28-
Type fieldType = aField.getGenericType();
29-
_evalType = _resolver.getJavaTypeForType(fieldType);
3027
}
3128

3229
/**
@@ -38,6 +35,18 @@ public boolean isEnumConstant()
3835
return fieldClass != null && fieldClass.isEnum();
3936
}
4037

38+
/**
39+
* Override to get eval type dynamically.
40+
*/
41+
@Override
42+
public JavaType getEvalType()
43+
{
44+
if (_evalType != null) return _evalType;
45+
Type fieldType = _field.getGenericType();
46+
JavaType evalType = _resolver.getJavaTypeForType(fieldType);
47+
return _evalType = evalType;
48+
}
49+
4150
/**
4251
* Evaluates field for given object.
4352
*/
@@ -64,7 +73,7 @@ public String getSuggestionString()
6473
String evalTypeName = evalType != null ? evalType.getSimpleName() : null;
6574

6675
// Construct string: SimpleName : EvalType.SimpleName
67-
StringBuffer sb = new StringBuffer(simpleName);
76+
StringBuilder sb = new StringBuilder(simpleName);
6877
if (evalTypeName != null)
6978
sb.append(" - ").append(evalTypeName);
7079

0 commit comments

Comments
 (0)