diff --git a/langserver/java/source-type.js b/langserver/java/source-type.js index fa23eb2..5fe8dbc 100644 --- a/langserver/java/source-type.js +++ b/langserver/java/source-type.js @@ -52,7 +52,12 @@ class SourceType extends CEIType { this.fields = type.fields.map(f => new SourceField(this, f)); this.methods = type.methods.map(m => new SourceMethod(this, m)); + /** @type {Constructor[]} */ this.constructors = type.constructors.map(c => new SourceConstructor(this, c)); + if (!type.constructors[0] && type.kind() === 'class') { + // add a default public constructor if this is a class with no explicit constructors + this.constructors.push(new DefaultConstructor(this)); + } super.typevars = type.typevars.map(tv => { const typevar = new TypeVariable(tv.name); // automatically add the Object bound @@ -147,9 +152,30 @@ class SourceConstructor extends Constructor { get returnType() { return this._owner; } - } +class DefaultConstructor extends Constructor { + /** + * @param {SourceType} owner + */ + constructor(owner) { + super(['public']); + this._owner = owner; + } + + get methodSignature() { + return `()V`; + } + + /** + * @returns {SourceType} + */ + get returnType() { + return this._owner; + } +} + + class SourceMethod extends Method { /** * @param {SourceType} owner @@ -226,3 +252,4 @@ exports.SourceField = SourceField; exports.SourceMethod = SourceMethod; exports.SourceParameter = SourceParameter; exports.SourceConstructor = SourceConstructor; +exports.DefaultConstructor = DefaultConstructor; diff --git a/langserver/java/validater.js b/langserver/java/validater.js index 1aea37d..0d3b376 100644 --- a/langserver/java/validater.js +++ b/langserver/java/validater.js @@ -3,7 +3,7 @@ const { ModuleBlock, TypeDeclBlock } = require('./parser9'); const { resolveImports } = require('../java/import-resolver'); const ResolvedImport = require('../java/parsetypes/resolved-import'); const { resolveType } = require('../java/type-resolver'); -const { SourceType } = require('./source-type'); +const { SourceType, SourceConstructor } = require('./source-type'); const { parseBody } = require('./body-parser3'); @@ -59,6 +59,10 @@ function validate(mod, androidLibrary) { let probs = []; source_types.forEach(t => { t.constructors.forEach(c => { + // ignore any default constructors + if (!(c instanceof SourceConstructor)) { + return; + } console.log(c.label); const parsed = parseBody(c._owner._decl.mod.source, c, imports.resolved, imports.typemap); if (parsed)