From c09620c4817223f34d36e89762c324e38e5b819c Mon Sep 17 00:00:00 2001 From: Dave Holoway Date: Mon, 8 Jun 2020 13:53:24 +0100 Subject: [PATCH] add SourceInitialiser support --- langserver/java/body-parser3.js | 6 +++--- langserver/java/parser9.js | 14 ++++++++++++++ langserver/java/source-type.js | 24 +++++++++++++++++++++--- langserver/java/validater.js | 6 ++++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/langserver/java/body-parser3.js b/langserver/java/body-parser3.js index a2b0e8f..48309ba 100644 --- a/langserver/java/body-parser3.js +++ b/langserver/java/body-parser3.js @@ -5,13 +5,13 @@ * Each token also contains detailed state information used for completion suggestions. */ const { JavaType, CEIType, PrimitiveType, ArrayType, UnresolvedType, WildcardType, TypeVariable, Field, Method, Parameter, Constructor, signatureToType } = require('java-mti'); -const { SourceMethod, SourceConstructor } = require('./source-type'); +const { SourceMethod, SourceConstructor, SourceInitialiser } = require('./source-type'); const ResolvedImport = require('./parsetypes/resolved-import'); const ParseProblem = require('./parsetypes/parse-problem'); const { getOperatorType, Token } = require('./tokenizer'); /** - * @typedef {SourceMethod|SourceConstructor} SourceMC + * @typedef {SourceMethod|SourceConstructor|SourceInitialiser} SourceMC */ @@ -44,7 +44,7 @@ function parseBody(method, imports, typemap) { const tokenlist = new TokenList(flattenBlocks(body.blocks)); let block = null; try { - statementBlock(tokenlist, [], method, imports, typemap); + block = statementBlock(tokenlist, [], method, imports, typemap); } catch (err) { addproblem(tokenlist, ParseProblem.Information(tokenlist.current, `Parse failed: ${err.message}`)); diff --git a/langserver/java/parser9.js b/langserver/java/parser9.js index 9cfcf11..cfd7ad2 100644 --- a/langserver/java/parser9.js +++ b/langserver/java/parser9.js @@ -504,6 +504,15 @@ class InitialiserBlock extends DeclarationBlock { constructor(section, simplified, match) { super(section, simplified); } + + /** + * Returns the TextBlock associated with the method body + */ + body() { + // always the last block atm + const blocks = this.blockArray(); + return blocks.blocks[blocks.blocks.length - 1]; + } } class TypeDeclBlock extends DeclarationBlock { @@ -601,6 +610,11 @@ class TypeDeclBlock extends DeclarationBlock { return this.parsed.constructors; } + get initialisers() { + this._ensureParsed(); + return this.parsed.initialisers; + } + get types() { this._ensureParsed(); return this.parsed.types; diff --git a/langserver/java/source-type.js b/langserver/java/source-type.js index 4ff82e9..73b0897 100644 --- a/langserver/java/source-type.js +++ b/langserver/java/source-type.js @@ -1,5 +1,5 @@ -const { JavaType, CEIType, Constructor, Method, Field, Parameter, TypeVariable, UnresolvedType } = require('java-mti'); -const { ModuleBlock, TypeDeclBlock, FieldBlock, ConstructorBlock, MethodBlock, ParameterBlock, TextBlock, TextBlockArray } = require('./parser9'); +const { JavaType, CEIType, PrimitiveType, Constructor, Method, MethodBase, Field, Parameter, TypeVariable, UnresolvedType } = require('java-mti'); +const { ModuleBlock, TypeDeclBlock, FieldBlock, ConstructorBlock, MethodBlock, InitialiserBlock, ParameterBlock, TextBlock } = require('./parser9'); /** * @@ -58,8 +58,9 @@ class SourceType extends CEIType { // add a default public constructor if this is a class with no explicit constructors this.constructors.push(new DefaultConstructor(this)); } + this.initers = type.initialisers.map(i => new SourceInitialiser(this, i)); super.typevars = type.typevars.map(tv => { - const typevar = new TypeVariable(tv.name); + const typevar = new TypeVariable(this, tv.name); // automatically add the Object bound typevar.bounds.push(new TypeVariable.Bound(this, 'Ljava/lang/Object;', false)); return typevar; @@ -181,6 +182,22 @@ class DefaultConstructor extends Constructor { } +class SourceInitialiser extends MethodBase { + /** + * @param {SourceType} owner + * @param {InitialiserBlock} decl + */ + constructor(owner, decl) { + super(mapmods(decl), decl.docs); + this._owner = owner; + this._decl = decl; + } + + get returnType() { + return PrimitiveType.map.V; + } +} + class SourceMethod extends Method { /** * @param {SourceType} owner @@ -254,3 +271,4 @@ exports.SourceMethod = SourceMethod; exports.SourceParameter = SourceParameter; exports.SourceConstructor = SourceConstructor; exports.DefaultConstructor = DefaultConstructor; +exports.SourceInitialiser = SourceInitialiser; diff --git a/langserver/java/validater.js b/langserver/java/validater.js index f7adfcc..59083e1 100644 --- a/langserver/java/validater.js +++ b/langserver/java/validater.js @@ -58,6 +58,12 @@ function validate(mod, androidLibrary) { let probs = []; source_types.forEach(t => { + t.initers.forEach(i => { + console.log('()'); + const parsed = parseBody(i, imports.resolved, imports.typemap); + if (parsed) + probs = probs.concat(parsed.problems) + }) t.constructors.forEach(c => { // ignore any default constructors if (!(c instanceof SourceConstructor)) {