diff --git a/examples/basic/src/classes.ts b/examples/basic/src/classes.ts index f558b64ae..b97c967ee 100644 --- a/examples/basic/src/classes.ts +++ b/examples/basic/src/classes.ts @@ -50,12 +50,12 @@ export interface IPrintNameInterface extends INameInterface, IPrintInterface * * [[include:class-example.md]] */ -export class BaseClass implements INameInterface +export abstract class BaseClass implements INameInterface { /** * This is a simple public member. */ - public name:string; + public abstract name:string; /** * This is a simple protected member. @@ -90,6 +90,7 @@ export class BaseClass implements INameInterface this.checkName(); } + public abstract abstractMethod(): void; /** * This is a simple member function. @@ -197,6 +198,8 @@ class InternalClass */ export class SubClassA extends BaseClass implements IPrintNameInterface { + public name:string; + /** * This is a simple interface function. */ @@ -250,6 +253,10 @@ export class SubClassA extends BaseClass implements IPrintNameInterface public set writeOnlyNameProperty(value:string) { this.name = value; } + + public abstractMethod(): void { + + } } @@ -260,10 +267,16 @@ export class SubClassA extends BaseClass implements IPrintNameInterface */ export class SubClassB extends BaseClass { + public name: string; + constructor(name:string) { super(name); } + abstractMethod(): void { + + } + doSomething(value:[string, SubClassA, SubClassB]) { } } diff --git a/examples/basic/src/variables.ts b/examples/basic/src/variables.ts new file mode 100644 index 000000000..43dc46ac1 --- /dev/null +++ b/examples/basic/src/variables.ts @@ -0,0 +1,14 @@ +/** + * A const variable + */ +export const constVariable = 'const'; + +/** + * A let variable + */ +export let letVariable = 'let'; + +/** + * A var variable + */ +export var varVariable= 'var'; diff --git a/src/lib/converter/nodes/class.ts b/src/lib/converter/nodes/class.ts index 6e08fa96c..30a092f99 100644 --- a/src/lib/converter/nodes/class.ts +++ b/src/lib/converter/nodes/class.ts @@ -1,7 +1,7 @@ import * as ts from 'typescript'; import * as _ts from '../../ts-internal'; -import { Reflection, ReflectionKind, DeclarationReflection } from '../../models/index'; +import { Reflection, ReflectionFlag, ReflectionKind, DeclarationReflection } from '../../models/index'; import { createDeclaration } from '../factories/index'; import { Context } from '../context'; import { Component, ConverterNodeComponent } from '../components'; @@ -29,6 +29,10 @@ export class ClassConverter extends ConverterNodeComponent reflection = context.scope; } else { reflection = createDeclaration(context, node, ReflectionKind.Class); + // set possible abstract flag here, where node is not the inherited parent + if (node.modifiers && node.modifiers.some( m => m.kind === ts.SyntaxKind.AbstractKeyword )) { + reflection.setFlag(ReflectionFlag.Abstract, true); + } } context.withScope(reflection, node.typeParameters, () => { diff --git a/src/lib/converter/nodes/function.ts b/src/lib/converter/nodes/function.ts index 1b47ee478..e651c35d1 100644 --- a/src/lib/converter/nodes/function.ts +++ b/src/lib/converter/nodes/function.ts @@ -1,6 +1,6 @@ import * as ts from 'typescript'; -import { Reflection, ReflectionKind } from '../../models/index'; +import { Reflection, ReflectionFlag, ReflectionKind } from '../../models/index'; import { createDeclaration, createSignature } from '../factories/index'; import { Context } from '../context'; import { Converter } from '../converter'; @@ -30,6 +30,13 @@ export class FunctionConverter extends ConverterNodeComponent node, kind); + if (method // child inheriting will return null on createDeclaration + && kind & ReflectionKind.Method + && node.modifiers + && node.modifiers.some( m => m.kind === ts.SyntaxKind.AbstractKeyword )) { + method.setFlag(ReflectionFlag.Abstract, true); + } + context.withScope(method, () => { if (!hasBody || !method.signatures) { const signature = createSignature(context, node, method.name, ReflectionKind.CallSignature); diff --git a/src/lib/converter/nodes/variable.ts b/src/lib/converter/nodes/variable.ts index f804aaf40..76b6feed4 100644 --- a/src/lib/converter/nodes/variable.ts +++ b/src/lib/converter/nodes/variable.ts @@ -1,7 +1,7 @@ import * as ts from 'typescript'; import * as _ts from '../../ts-internal'; -import { Reflection, ReflectionKind, IntrinsicType } from '../../models/index'; +import { Reflection, ReflectionFlag, ReflectionKind, IntrinsicType } from '../../models/index'; import { createDeclaration, createComment } from '../factories/index'; import { Context } from '../context'; import { Component, ConverterNodeComponent } from '../components'; @@ -61,6 +61,24 @@ export class VariableConverter extends ConverterNodeComponent m.kind === ts.SyntaxKind.AbstractKeyword )) { + variable.setFlag(ReflectionFlag.Abstract, true); + } + break; + } + context.withScope(variable, () => { if (node.initializer) { switch (node.initializer.kind) { diff --git a/src/lib/models/reflections/abstract.ts b/src/lib/models/reflections/abstract.ts index ed2ef1cc7..277d97776 100644 --- a/src/lib/models/reflections/abstract.ts +++ b/src/lib/models/reflections/abstract.ts @@ -76,7 +76,10 @@ export enum ReflectionFlag { Optional = 128, DefaultValue = 256, Rest = 512, - ConstructorProperty = 1024 + ConstructorProperty = 1024, + Abstract = 2048, + Const = 4096, + Let = 8192 } const relevantFlags: ReflectionFlag[] = [ @@ -86,7 +89,10 @@ const relevantFlags: ReflectionFlag[] = [ ReflectionFlag.ExportAssignment, ReflectionFlag.Optional, ReflectionFlag.DefaultValue, - ReflectionFlag.Rest + ReflectionFlag.Rest, + ReflectionFlag.Abstract, + ReflectionFlag.Let, + ReflectionFlag.Const ]; export interface ReflectionFlags extends Array { @@ -140,6 +146,12 @@ export interface ReflectionFlags extends Array { hasExportAssignment?: boolean; isConstructorProperty?: boolean; + + isAbstract?: boolean; + + isConst?: boolean; + + isLet?: boolean; } export interface DefaultValueContainer extends Reflection { @@ -405,6 +417,15 @@ export abstract class Reflection { case ReflectionFlag.ConstructorProperty: this.flags.isConstructorProperty = value; break; + case ReflectionFlag.Abstract: + this.flags.isAbstract = value; + break; + case ReflectionFlag.Let: + this.flags.isLet = value; + break; + case ReflectionFlag.Const: + this.flags.isConst = value; + break; } } diff --git a/src/test/converter/access/specs.json b/src/test/converter/access/specs.json index c2f1ffa3e..17e9a47bd 100644 --- a/src/test/converter/access/specs.json +++ b/src/test/converter/access/specs.json @@ -179,7 +179,8 @@ "kindString": "Variable", "flags": { "isPrivate": true, - "isExported": true + "isExported": true, + "isConst": true }, "comment": { "shortText": "A variable that is made private via comment." @@ -204,7 +205,8 @@ "kindString": "Variable", "flags": { "isExported": true, - "isProtected": true + "isProtected": true, + "isConst": true }, "comment": { "shortText": "A variable that is made protected via comment." diff --git a/src/test/converter/array/specs.json b/src/test/converter/array/specs.json index bdfd7695d..cccc4ca4d 100644 --- a/src/test/converter/array/specs.json +++ b/src/test/converter/array/specs.json @@ -48,7 +48,8 @@ "kind": 32, "kindString": "Variable", "flags": { - "isExported": true + "isExported": true, + "isConst": true }, "comment": { "shortText": "A const of a complex type." @@ -112,7 +113,8 @@ "kind": 32, "kindString": "Variable", "flags": { - "isExported": true + "isExported": true, + "isConst": true }, "comment": { "shortText": "An exported const of the custom array type." diff --git a/src/test/converter/class/class.ts b/src/test/converter/class/class.ts index cc5f2195c..c315d3882 100644 --- a/src/test/converter/class/class.ts +++ b/src/test/converter/class/class.ts @@ -74,3 +74,16 @@ export class TestSubClass extends TestClass super(); } } + + +export abstract class TestAbstractClass { + abstract myAbstractProperty: string; + + protected abstract myAbstractMethod(): void; +} + +export class TestAbstractClassImplementation extends TestAbstractClass { + myAbstractProperty: string; + + protected myAbstractMethod(): void { } +} \ No newline at end of file diff --git a/src/test/converter/class/specs.json b/src/test/converter/class/specs.json index 34aa59bf0..d8d9ce427 100644 --- a/src/test/converter/class/specs.json +++ b/src/test/converter/class/specs.json @@ -14,6 +14,206 @@ }, "originalName": "%BASE%/class/class.ts", "children": [ + { + "id": 34, + "name": "TestAbstractClass", + "kind": 128, + "kindString": "Class", + "flags": { + "isExported": true, + "isAbstract": true + }, + "children": [ + { + "id": 35, + "name": "myAbstractProperty", + "kind": 1024, + "kindString": "Property", + "flags": { + "isExported": true, + "isAbstract": true + }, + "sources": [ + { + "fileName": "class.ts", + "line": 80, + "character": 31 + } + ], + "type": { + "type": "intrinsic", + "name": "string" + } + }, + { + "id": 36, + "name": "myAbstractMethod", + "kind": 2048, + "kindString": "Method", + "flags": { + "isExported": true, + "isProtected": true, + "isAbstract": true + }, + "signatures": [ + { + "id": 37, + "name": "myAbstractMethod", + "kind": 4096, + "kindString": "Call signature", + "flags": {}, + "type": { + "type": "intrinsic", + "name": "void" + } + } + ], + "sources": [ + { + "fileName": "class.ts", + "line": 82, + "character": 39 + } + ] + } + ], + "groups": [ + { + "title": "Properties", + "kind": 1024, + "children": [ + 35 + ] + }, + { + "title": "Methods", + "kind": 2048, + "children": [ + 36 + ] + } + ], + "sources": [ + { + "fileName": "class.ts", + "line": 79, + "character": 39 + } + ], + "extendedBy": [ + { + "type": "reference", + "name": "TestAbstractClassImplementation", + "id": 38 + } + ] + }, + { + "id": 38, + "name": "TestAbstractClassImplementation", + "kind": 128, + "kindString": "Class", + "flags": { + "isExported": true + }, + "children": [ + { + "id": 39, + "name": "myAbstractProperty", + "kind": 1024, + "kindString": "Property", + "flags": { + "isExported": true + }, + "sources": [ + { + "fileName": "class.ts", + "line": 86, + "character": 22 + } + ], + "type": { + "type": "intrinsic", + "name": "string" + }, + "overwrites": { + "type": "reference", + "name": "TestAbstractClass.myAbstractProperty", + "id": 35 + } + }, + { + "id": 40, + "name": "myAbstractMethod", + "kind": 2048, + "kindString": "Method", + "flags": { + "isExported": true, + "isProtected": true + }, + "signatures": [ + { + "id": 41, + "name": "myAbstractMethod", + "kind": 4096, + "kindString": "Call signature", + "flags": {}, + "type": { + "type": "intrinsic", + "name": "void" + }, + "overwrites": { + "type": "reference", + "name": "TestAbstractClass.myAbstractMethod", + "id": 36 + } + } + ], + "sources": [ + { + "fileName": "class.ts", + "line": 88, + "character": 30 + } + ], + "overwrites": { + "type": "reference", + "name": "TestAbstractClass.myAbstractMethod", + "id": 36 + } + } + ], + "groups": [ + { + "title": "Properties", + "kind": 1024, + "children": [ + 39 + ] + }, + { + "title": "Methods", + "kind": 2048, + "children": [ + 40 + ] + } + ], + "sources": [ + { + "fileName": "class.ts", + "line": 85, + "character": 44 + } + ], + "extendedTypes": [ + { + "type": "reference", + "name": "TestAbstractClass", + "id": 34 + } + ] + }, { "id": 2, "name": "TestClass", @@ -748,6 +948,8 @@ "title": "Classes", "kind": 128, "children": [ + 34, + 38, 2, 16 ] diff --git a/src/test/converter/enum/specs.json b/src/test/converter/enum/specs.json index 4ede6dbc9..418970886 100644 --- a/src/test/converter/enum/specs.json +++ b/src/test/converter/enum/specs.json @@ -92,7 +92,8 @@ "kind": 32, "kindString": "Variable", "flags": { - "isExported": true + "isExported": true, + "isLet": true }, "comment": { "shortText": "This is a variable appended to an enumeration." diff --git a/src/test/converter/export-default/specs.json b/src/test/converter/export-default/specs.json index 9ef61c947..d3e0908a3 100644 --- a/src/test/converter/export-default/specs.json +++ b/src/test/converter/export-default/specs.json @@ -20,7 +20,8 @@ "kind": 32, "kindString": "Variable", "flags": { - "isExported": true + "isExported": true, + "isConst": true }, "sources": [ { diff --git a/src/test/converter/export/specs.json b/src/test/converter/export/specs.json index 02c637672..852eff5c2 100644 --- a/src/test/converter/export/specs.json +++ b/src/test/converter/export/specs.json @@ -20,7 +20,8 @@ "kind": 32, "kindString": "Variable", "flags": { - "isExported": true + "isExported": true, + "isConst": true }, "sources": [ { diff --git a/src/test/converter/function/specs.json b/src/test/converter/function/specs.json index d6843bdb9..4eb212e38 100644 --- a/src/test/converter/function/specs.json +++ b/src/test/converter/function/specs.json @@ -63,7 +63,9 @@ "name": "functionVariable", "kind": 32, "kindString": "Variable", - "flags": {}, + "flags": { + "isLet": true + }, "comment": { "shortText": "This variable is appended to a function." }, @@ -680,7 +682,8 @@ "kind": 64, "kindString": "Function", "flags": { - "isExported": true + "isExported": true, + "isConst": true }, "comment": { "shortText": "This is a function that is assigned to a variable.", diff --git a/src/test/converter/implicit-types/specs.json b/src/test/converter/implicit-types/specs.json index 8378ecc0e..893195c83 100644 --- a/src/test/converter/implicit-types/specs.json +++ b/src/test/converter/implicit-types/specs.json @@ -87,7 +87,9 @@ "name": "_breakpoints", "kind": 32, "kindString": "Variable", - "flags": {}, + "flags": { + "isLet": true + }, "sources": [ { "fileName": "implicit-types.ts", diff --git a/src/test/converter/literal-object-callbacks/specs.json b/src/test/converter/literal-object-callbacks/specs.json index 822e78374..4bc558c24 100644 --- a/src/test/converter/literal-object-callbacks/specs.json +++ b/src/test/converter/literal-object-callbacks/specs.json @@ -19,7 +19,9 @@ "name": "onError", "kind": 64, "kindString": "Function", - "flags": {}, + "flags": { + "isLet": true + }, "signatures": [ { "id": 5, @@ -46,7 +48,9 @@ "name": "onFinally", "kind": 64, "kindString": "Function", - "flags": {}, + "flags": { + "isLet": true + }, "signatures": [ { "id": 7, @@ -73,7 +77,9 @@ "name": "onSuccess", "kind": 64, "kindString": "Function", - "flags": {}, + "flags": { + "isLet": true + }, "signatures": [ { "id": 3, @@ -100,7 +106,9 @@ "name": "callbackReturn", "kind": 2097152, "kindString": "Object literal", - "flags": {}, + "flags": { + "isConst": true + }, "children": [ { "id": 14, diff --git a/src/test/converter/literal-object/specs.json b/src/test/converter/literal-object/specs.json index cb8804d41..5aac63ad6 100644 --- a/src/test/converter/literal-object/specs.json +++ b/src/test/converter/literal-object/specs.json @@ -19,7 +19,9 @@ "name": "objectLiteral", "kind": 2097152, "kindString": "Object literal", - "flags": {}, + "flags": { + "isConst": true + }, "comment": { "shortText": "An object literal." }, diff --git a/src/test/converter/literal-type/specs.json b/src/test/converter/literal-type/specs.json index cb7119229..1d4145393 100644 --- a/src/test/converter/literal-type/specs.json +++ b/src/test/converter/literal-type/specs.json @@ -19,7 +19,9 @@ "name": "typeLiteral", "kind": 32, "kindString": "Variable", - "flags": {}, + "flags": { + "isLet": true + }, "sources": [ { "fileName": "literal-type.ts", diff --git a/src/test/converter/variable/specs.json b/src/test/converter/variable/specs.json new file mode 100644 index 000000000..793b1c733 --- /dev/null +++ b/src/test/converter/variable/specs.json @@ -0,0 +1,112 @@ +{ + "id": 0, + "name": "typedoc", + "kind": 0, + "flags": {}, + "children": [ + { + "id": 1, + "name": "\"variable\"", + "kind": 1, + "kindString": "External module", + "flags": { + "isExported": true + }, + "originalName": "%BASE%/variable/variable.ts", + "children": [ + { + "id": 2, + "name": "myConst", + "kind": 32, + "kindString": "Variable", + "flags": { + "isExported": true, + "isConst": true + }, + "sources": [ + { + "fileName": "variable.ts", + "line": 1, + "character": 20 + } + ], + "type": { + "type": "unknown", + "name": "15" + }, + "defaultValue": "15" + }, + { + "id": 3, + "name": "myLet", + "kind": 32, + "kindString": "Variable", + "flags": { + "isExported": true, + "isLet": true + }, + "sources": [ + { + "fileName": "variable.ts", + "line": 2, + "character": 16 + } + ], + "type": { + "type": "intrinsic", + "name": "number" + }, + "defaultValue": "15" + }, + { + "id": 4, + "name": "myVar", + "kind": 32, + "kindString": "Variable", + "flags": { + "isExported": true + }, + "sources": [ + { + "fileName": "variable.ts", + "line": 3, + "character": 16 + } + ], + "type": { + "type": "intrinsic", + "name": "number" + }, + "defaultValue": "15" + } + ], + "groups": [ + { + "title": "Variables", + "kind": 32, + "children": [ + 2, + 3, + 4 + ] + } + ], + "sources": [ + { + "fileName": "variable.ts", + "line": 1, + "character": 0 + } + ] + } + ], + "groups": [ + { + "title": "External modules", + "kind": 1, + "children": [ + 1 + ] + } + ] +} \ No newline at end of file diff --git a/src/test/converter/variable/variable.ts b/src/test/converter/variable/variable.ts new file mode 100644 index 000000000..1ff86660d --- /dev/null +++ b/src/test/converter/variable/variable.ts @@ -0,0 +1,3 @@ +export const myConst = 15; +export let myLet = 15; +export var myVar = 15; diff --git a/src/test/renderer/specs/classes/_access_.privateclass.html b/src/test/renderer/specs/classes/_access_.privateclass.html index c2698981d..2f5a3c4de 100644 --- a/src/test/renderer/specs/classes/_access_.privateclass.html +++ b/src/test/renderer/specs/classes/_access_.privateclass.html @@ -233,6 +233,9 @@

Returns void "typescript-1.5" +
  • + "variables" +