mirror of
https://github.com/adelphes/android-dev-ext.git
synced 2025-12-23 01:48:18 +00:00
fix interface constructors
check constructor type modifiers
This commit is contained in:
@@ -1354,7 +1354,12 @@ function rootTerm(tokens, locals, method, imports, typemap) {
|
|||||||
return new ResolvedIdent(new_ident, [new Value(new_ident, ctr.types[0])]);
|
return new ResolvedIdent(new_ident, [new Value(new_ident, ctr.types[0])]);
|
||||||
}
|
}
|
||||||
if (ctr.variables[0] instanceof ConstructorCall) {
|
if (ctr.variables[0] instanceof ConstructorCall) {
|
||||||
|
const ctr_type = ctr.variables[0].type;
|
||||||
if (tokens.current.value === '{') {
|
if (tokens.current.value === '{') {
|
||||||
|
// final types cannot be inherited
|
||||||
|
if (ctr_type.modifiers.includes('final') ) {
|
||||||
|
addproblem(tokens, ParseProblem.Error(tokens.current, `Type '${ctr_type.fullyDottedTypeName}' is declared final and cannot be inherited from.`));
|
||||||
|
}
|
||||||
// anonymous type - just skip for now
|
// anonymous type - just skip for now
|
||||||
for (let balance = 0;;) {
|
for (let balance = 0;;) {
|
||||||
if (tokens.isValue('{')) {
|
if (tokens.isValue('{')) {
|
||||||
@@ -1365,6 +1370,11 @@ function rootTerm(tokens, locals, method, imports, typemap) {
|
|||||||
}
|
}
|
||||||
} else tokens.inc();
|
} else tokens.inc();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// abstract and interface types must have a type body
|
||||||
|
if (ctr_type.typeKind === 'interface' || ctr_type.modifiers.includes('abstract') ) {
|
||||||
|
addproblem(tokens, ParseProblem.Error(tokens.current, `Type '${ctr_type.fullyDottedTypeName}' is abstract and cannot be instantiated without a body`));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new ResolvedIdent(new_ident, [new Value(new_ident, ctr.variables[0].type)]);
|
return new ResolvedIdent(new_ident, [new Value(new_ident, ctr.variables[0].type)]);
|
||||||
}
|
}
|
||||||
@@ -1515,8 +1525,9 @@ function arrayElementOrConstructor(tokens, open_array, matches, index) {
|
|||||||
* @param {TokenList} tokens
|
* @param {TokenList} tokens
|
||||||
* @param {ResolvedIdent} instance
|
* @param {ResolvedIdent} instance
|
||||||
* @param {ResolvedIdent[]} call_arguments
|
* @param {ResolvedIdent[]} call_arguments
|
||||||
|
* @param {Map<String, JavaType>} typemap
|
||||||
*/
|
*/
|
||||||
function methodCallExpression(tokens, instance, call_arguments) {
|
function methodCallExpression(tokens, instance, call_arguments, typemap) {
|
||||||
const ident = `${instance.source}(${call_arguments.map(arg => arg.source).join(',')})`;
|
const ident = `${instance.source}(${call_arguments.map(arg => arg.source).join(',')})`;
|
||||||
// to keep this simple for now, only resolve if there is exactly one variable for each argument
|
// to keep this simple for now, only resolve if there is exactly one variable for each argument
|
||||||
for (let arg of call_arguments) {
|
for (let arg of call_arguments) {
|
||||||
@@ -1532,7 +1543,13 @@ function methodCallExpression(tokens, instance, call_arguments) {
|
|||||||
const arg_types = call_arguments.map(arg => getParameterCompatibleTypeSignatures(arg.variables[0].type));
|
const arg_types = call_arguments.map(arg => getParameterCompatibleTypeSignatures(arg.variables[0].type));
|
||||||
|
|
||||||
const methods = instance.methods.filter(m => isCallCompatible(m, arg_types));
|
const methods = instance.methods.filter(m => isCallCompatible(m, arg_types));
|
||||||
const types = instance.types.filter(t => t.constructors.find(c => isCallCompatible(c, arg_types)));
|
const types = instance.types.filter(t => {
|
||||||
|
// interfaces use Object constructors
|
||||||
|
const type = t.typeKind === 'interface'
|
||||||
|
? typemap.get('java/lang/Object')
|
||||||
|
: t;
|
||||||
|
return type.constructors.find(c => isCallCompatible(c, arg_types));
|
||||||
|
});
|
||||||
|
|
||||||
if (!types[0] && !methods[0]) {
|
if (!types[0] && !methods[0]) {
|
||||||
if (instance.methods[0]) {
|
if (instance.methods[0]) {
|
||||||
@@ -1670,7 +1687,7 @@ function qualifiers(matches, tokens, locals, method, imports, typemap) {
|
|||||||
args = expressionList(tokens, locals, method, imports, typemap);
|
args = expressionList(tokens, locals, method, imports, typemap);
|
||||||
tokens.expectValue(')');
|
tokens.expectValue(')');
|
||||||
}
|
}
|
||||||
matches = methodCallExpression(tokens, matches, args);
|
matches = methodCallExpression(tokens, matches, args, typemap);
|
||||||
break;
|
break;
|
||||||
case '<':
|
case '<':
|
||||||
// generic type arguments - since this can be confused with less-than, only parse
|
// generic type arguments - since this can be confused with less-than, only parse
|
||||||
|
|||||||
Reference in New Issue
Block a user