pass scoped type instead of method to typeIdent

This commit is contained in:
Dave Holoway
2020-06-08 16:18:49 +01:00
parent 261abb9cc7
commit 7c9acfd7ca
2 changed files with 14 additions and 14 deletions

View File

@@ -1915,7 +1915,7 @@ function qualifiers(matches, tokens, locals, method, imports, typemap) {
tokens.inc(); tokens.inc();
let type_arguments = []; let type_arguments = [];
if (!tokens.isValue('>')) { if (!tokens.isValue('>')) {
type_arguments = typeIdentList(tokens, method, imports, typemap); type_arguments = typeIdentList(tokens, method._owner, imports, typemap);
tokens.expectValue('>'); tokens.expectValue('>');
} }
matches.types = matches.types.map(t => { matches.types = matches.types.map(t => {

View File

@@ -1,4 +1,4 @@
const { ArrayType, JavaType, WildcardType } = require('java-mti'); const { ArrayType, CEIType, JavaType, WildcardType } = require('java-mti');
const { SourceMethod, SourceConstructor, SourceInitialiser } = require('./source-type'); const { SourceMethod, SourceConstructor, SourceInitialiser } = require('./source-type');
const ResolvedImport = require('./parsetypes/resolved-import'); const ResolvedImport = require('./parsetypes/resolved-import');
const { resolveTypeOrPackage, resolveNextTypeOrPackage } = require('./type-resolver'); const { resolveTypeOrPackage, resolveNextTypeOrPackage } = require('./type-resolver');
@@ -12,16 +12,16 @@ const { AnyType } = require("./body-types");
/** /**
* @param {TokenList} tokens * @param {TokenList} tokens
* @param {SourceMC} method * @param {CEIType} scoped_type
* @param {ResolvedImport[]} imports * @param {ResolvedImport[]} imports
* @param {Map<string,JavaType>} typemap * @param {Map<string,JavaType>} typemap
*/ */
function typeIdentList(tokens, method, imports, typemap) { function typeIdentList(tokens, scoped_type, imports, typemap) {
let type = typeIdent(tokens, method, imports, typemap); let type = typeIdent(tokens, scoped_type, imports, typemap);
const types = [type]; const types = [type];
while (tokens.current.value === ',') { while (tokens.current.value === ',') {
tokens.inc(); tokens.inc();
type = typeIdent(tokens, method, imports, typemap); type = typeIdent(tokens, scoped_type, imports, typemap);
types.push(type); types.push(type);
} }
return types; return types;
@@ -29,18 +29,18 @@ function typeIdentList(tokens, method, imports, typemap) {
/** /**
* @param {TokenList} tokens * @param {TokenList} tokens
* @param {SourceMC} method * @param {CEIType} scoped_type
* @param {ResolvedImport[]} imports * @param {ResolvedImport[]} imports
* @param {Map<string,JavaType>} typemap * @param {Map<string,JavaType>} typemap
*/ */
function typeIdent(tokens, method, imports, typemap) { function typeIdent(tokens, scoped_type, imports, typemap) {
if (tokens.current.kind !== 'ident') { if (tokens.current.kind !== 'ident') {
if (tokens.current.value === '?') { if (tokens.current.value === '?') {
return wildcardTypeArgument(tokens, method, imports, typemap); return wildcardTypeArgument(tokens, scoped_type, imports, typemap);
} }
return AnyType.Instance; return AnyType.Instance;
} }
let { types, package_name } = resolveTypeOrPackage(tokens.current.value, method._owner, imports, typemap); let { types, package_name } = resolveTypeOrPackage(tokens.current.value, scoped_type, imports, typemap);
tokens.inc(); tokens.inc();
for (;;) { for (;;) {
if (tokens.isValue('.')) { if (tokens.isValue('.')) {
@@ -50,7 +50,7 @@ function typeIdent(tokens, method, imports, typemap) {
resolveNextTypeOrPackage(tokens.current.value, types, package_name, typemap); resolveNextTypeOrPackage(tokens.current.value, types, package_name, typemap);
} else if (tokens.isValue('<')) { } else if (tokens.isValue('<')) {
if (!tokens.isValue('>')) { if (!tokens.isValue('>')) {
typeIdentList(tokens, method, imports, typemap); typeIdentList(tokens, scoped_type, imports, typemap);
if (/>>>?/.test(tokens.current.value)) { if (/>>>?/.test(tokens.current.value)) {
// we need to split >> and >>> into separate > tokens to handle things like List<Class<?>> // we need to split >> and >>> into separate > tokens to handle things like List<Class<?>>
const new_tokens = tokens.current.value.split('').map((gt,i) => new Token(tokens.current.range.source, tokens.current.range.start + i, 1, 'comparison-operator')); const new_tokens = tokens.current.value.split('').map((gt,i) => new Token(tokens.current.range.source, tokens.current.range.start + i, 1, 'comparison-operator'));
@@ -81,12 +81,12 @@ function typeIdent(tokens, method, imports, typemap) {
/** /**
* @param {TokenList} tokens * @param {TokenList} tokens
* @param {SourceMC} method * @param {CEIType} scoped_type
* @param {ResolvedImport[]} imports * @param {ResolvedImport[]} imports
* @param {Map<string,JavaType>} typemap * @param {Map<string,JavaType>} typemap
* @returns {WildcardType} * @returns {WildcardType}
*/ */
function wildcardTypeArgument(tokens, method, imports, typemap) { function wildcardTypeArgument(tokens, scoped_type, imports, typemap) {
tokens.expectValue('?'); tokens.expectValue('?');
let bound = null; let bound = null;
switch (tokens.current.value) { switch (tokens.current.value) {
@@ -96,7 +96,7 @@ function wildcardTypeArgument(tokens, method, imports, typemap) {
tokens.inc(); tokens.inc();
bound = { bound = {
kind, kind,
type: typeIdent(tokens, method, imports, typemap), type: typeIdent(tokens, scoped_type, imports, typemap),
} }
break; break;
} }