mirror of
https://github.com/adelphes/android-dev-ext.git
synced 2025-12-23 09:59:25 +00:00
fix type checking of field and method declarations
This commit is contained in:
@@ -30,10 +30,10 @@ class AnyType extends JavaType {
|
|||||||
*/
|
*/
|
||||||
constructor(label) {
|
constructor(label) {
|
||||||
super("class", [], '');
|
super("class", [], '');
|
||||||
super.simpleTypeName = label;
|
super.simpleTypeName = label || '<unknown type>';
|
||||||
}
|
}
|
||||||
|
|
||||||
static Instance = new AnyType('<unknown type>');
|
static Instance = new AnyType('');
|
||||||
|
|
||||||
get rawTypeSignature() {
|
get rawTypeSignature() {
|
||||||
return 'U';
|
return 'U';
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ function typeIdentList(tokens, scope, imports, typemap) {
|
|||||||
function typeIdent(tokens, scope, imports, typemap, allow_array_qualifiers = true) {
|
function typeIdent(tokens, scope, imports, typemap, allow_array_qualifiers = true) {
|
||||||
/** @type {JavaType[]} */
|
/** @type {JavaType[]} */
|
||||||
let types = [], package_name = '';
|
let types = [], package_name = '';
|
||||||
|
const start_idx = tokens.idx;
|
||||||
switch(tokens.current.kind) {
|
switch(tokens.current.kind) {
|
||||||
case 'ident':
|
case 'ident':
|
||||||
({ types, package_name } = resolveTypeOrPackage(tokens.current.value, scope, imports, typemap));
|
({ types, package_name } = resolveTypeOrPackage(tokens.current.value, scope, imports, typemap));
|
||||||
@@ -59,7 +60,17 @@ function typeIdent(tokens, scope, imports, typemap, allow_array_qualifiers = tru
|
|||||||
tokens.inc();
|
tokens.inc();
|
||||||
} else if (tokens.isValue('<')) {
|
} else if (tokens.isValue('<')) {
|
||||||
genericTypeArgs(tokens, types, scope, imports, typemap);
|
genericTypeArgs(tokens, types, scope, imports, typemap);
|
||||||
} else if (allow_array_qualifiers && tokens.isValue('[')) {
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!types[0]) {
|
||||||
|
const anytype = new AnyType(tokens.tokens.slice(start_idx, tokens.idx).map(t => t.source).join('').trim());
|
||||||
|
types.push(anytype);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allow_array_qualifiers && tokens.isValue('[')) {
|
||||||
let arrdims = 0;
|
let arrdims = 0;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
arrdims++;
|
arrdims++;
|
||||||
@@ -68,16 +79,10 @@ function typeIdent(tokens, scope, imports, typemap, allow_array_qualifiers = tru
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!types[0]) {
|
|
||||||
types.push(AnyType.Instance);
|
|
||||||
}
|
|
||||||
types = types.map(t => new ArrayType(t, arrdims));
|
types = types.map(t => new ArrayType(t, arrdims));
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return types[0] || AnyType.Instance;
|
return types[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
const { ModuleBlock, TypeDeclBlock } = require('../parser9');
|
const { ModuleBlock, TypeDeclBlock } = require('../parser9');
|
||||||
const ParseProblem = require('../parsetypes/parse-problem');
|
const ParseProblem = require('../parsetypes/parse-problem');
|
||||||
const {SourceType} = require('../source-type');
|
const {SourceType} = require('../source-type');
|
||||||
const {JavaType, CEIType, TypeArgument, UnresolvedType} = require('java-mti')
|
const {JavaType, ArrayType, CEIType, TypeArgument, UnresolvedType} = require('java-mti');
|
||||||
|
const { AnyType } = require('../body-types');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {JavaType} type
|
* @param {JavaType} type
|
||||||
*/
|
*/
|
||||||
function checkType(type, is_return_type, typeTokens, probs) {
|
function checkType(type, is_return_type, typeTokens, probs) {
|
||||||
if (type instanceof UnresolvedType) {
|
const typesig = type.typeSignature;
|
||||||
|
if (/^\[*U/.test(typesig)) {
|
||||||
|
probs.push(ParseProblem.Error(typeTokens, `Unresolved type '${type.label}'`))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const typesig = type.typeSignature;
|
|
||||||
if (typesig === 'V' && !is_return_type) {
|
if (typesig === 'V' && !is_return_type) {
|
||||||
probs.push(ParseProblem.Error(typeTokens, `'void' is not a valid type for variables`))
|
probs.push(ParseProblem.Error(typeTokens, `'void' is not a valid type for variables`))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user