fix type checking of field and method declarations

This commit is contained in:
Dave Holoway
2020-06-11 15:50:55 +01:00
parent c454753385
commit 974ec93841
3 changed files with 26 additions and 19 deletions

View File

@@ -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';

View File

@@ -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,25 +60,29 @@ 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('[')) {
let arrdims = 0;
for(;;) {
arrdims++;
tokens.expectValue(']');
if (!tokens.isValue('[')) {
break;
}
}
if (!types[0]) {
types.push(AnyType.Instance);
}
types = types.map(t => new ArrayType(t, arrdims));
} else { } else {
break; break;
} }
} }
return types[0] || AnyType.Instance; 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;
for(;;) {
arrdims++;
tokens.expectValue(']');
if (!tokens.isValue('[')) {
break;
}
}
types = types.map(t => new ArrayType(t, arrdims));
}
return types[0];
} }
/** /**

View File

@@ -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`))
} }