Skip to content

Commit 90e2c36

Browse files
committed
Move the symbol classification and display parts writing to the Services and format the newlines correctly
1 parent 743046b commit 90e2c36

File tree

47 files changed

+372
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+372
-368
lines changed

src/compiler/checker.ts

Lines changed: 30 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,32 @@ module ts {
2323
return undefined;
2424
}
2525

26-
interface SymbolWriter {
27-
writeKind(text: string, kind: SymbolDisplayPartKind): void;
28-
writeSymbol(text: string, symbol: Symbol): void;
29-
writeLine(): void;
30-
increaseIndent(): void;
31-
decreaseIndent(): void;
32-
clear(): void;
33-
34-
// Called when the symbol writer encounters a symbol to write. Currently only used by the
35-
// declaration emitter to help determine if it should patch up the final declaration file
36-
// with import statements it previously saw (but chose not to emit).
37-
trackSymbol(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): void;
26+
export interface StringSymbolWriter extends SymbolWriter {
27+
string(): string;
3828
}
3929

40-
interface DisplayPartsSymbolWriter extends SymbolWriter {
41-
displayParts(): SymbolDisplayPart[];
42-
}
30+
// Pool writers to avoid needing to allocate them for every symbol we write.
31+
var stringWriters: StringSymbolWriter[] = [];
32+
export function getSingleLineStringWriter(): StringSymbolWriter {
33+
if (stringWriters.length == 0) {
34+
var str = "";
4335

44-
interface StringSymbolWriter extends SymbolWriter {
45-
string(): string;
46-
}
36+
return {
37+
string: () => str,
38+
writeKind: text => str += text,
39+
writeSymbol: text => str += text,
40+
41+
// Completely ignore indentation for string writers. And map newlines to
42+
// a single space.
43+
writeLine: () => str += " ",
44+
increaseIndent: () => { },
45+
decreaseIndent: () => { },
46+
clear: () => str = "",
47+
trackSymbol: () => { }
48+
};
49+
}
4750

48-
// TODO this should go back in services
49-
export function getSymbolDisplayPart(text: string, kind: SymbolDisplayPartKind, symbol?: Symbol): SymbolDisplayPart {
50-
return <SymbolDisplayPart> {
51-
text: text,
52-
kind: kind
53-
};
51+
return stringWriters.pop();
5452
}
5553

5654
/// fullTypeCheck denotes if this instance of the typechecker will be used to get semantic diagnostics.
@@ -92,9 +90,9 @@ module ts {
9290
getTypeOfNode: getTypeOfNode,
9391
getApparentType: getApparentType,
9492
typeToString: typeToString,
95-
typeToDisplayParts: typeToDisplayParts,
93+
writeType: writeType,
9694
symbolToString: symbolToString,
97-
symbolToDisplayParts: symbolToDisplayParts,
95+
writeSymbol: writeSymbol,
9896
getAugmentedPropertiesOfApparentType: getAugmentedPropertiesOfApparentType,
9997
getRootSymbol: getRootSymbol,
10098
getContextualType: getContextualType,
@@ -930,58 +928,6 @@ module ts {
930928
{ accessibility: SymbolAccessibility.NotAccessible, errorSymbolName: firstIdentifierName };
931929
}
932930

933-
// Pool writers to avoid needing to allocate them for every symbol we write.
934-
var displayPartWriters: DisplayPartsSymbolWriter[] = [];
935-
var stringWriters: StringSymbolWriter[] = [];
936-
937-
function getDisplayPartWriter(): DisplayPartsSymbolWriter {
938-
if (displayPartWriters.length == 0) {
939-
var displayParts: SymbolDisplayPart[] = [];
940-
return {
941-
displayParts: () => displayParts,
942-
writeKind: (text, kind) => displayParts.push(getSymbolDisplayPart(text, kind)),
943-
writeSymbol: (text, symbol) => displayParts.push(symbolPart(text, symbol)),
944-
945-
// Completely ignore indentation for display part writers. And map newlines to
946-
// a single space.
947-
writeLine: () => displayParts.push(spacePart()),
948-
increaseIndent: () => { },
949-
decreaseIndent: () => { },
950-
clear: () => displayParts = [],
951-
trackSymbol: () => { }
952-
};
953-
}
954-
955-
return displayPartWriters.pop();
956-
}
957-
958-
function getStringWriter(): StringSymbolWriter {
959-
if (stringWriters.length == 0) {
960-
var str = "";
961-
962-
return {
963-
string: () => str,
964-
writeKind: text => str += text,
965-
writeSymbol: text => str += text,
966-
967-
// Completely ignore indentation for string writers. And map newlines to
968-
// a single space.
969-
writeLine: () => str += " ",
970-
increaseIndent: () => { },
971-
decreaseIndent: () => { },
972-
clear: () => str = "",
973-
trackSymbol: () => { }
974-
};
975-
}
976-
977-
return stringWriters.pop();
978-
}
979-
980-
function releaseDisplayPartWriter(writer: DisplayPartsSymbolWriter) {
981-
writer.clear();
982-
displayPartWriters.push(writer);
983-
}
984-
985931
function releaseStringWriter(writer: StringSymbolWriter) {
986932
writer.clear()
987933
stringWriters.push(writer);
@@ -1004,7 +950,7 @@ module ts {
1004950
}
1005951

1006952
function symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): string {
1007-
var writer = getStringWriter();
953+
var writer = getSingleLineStringWriter();
1008954
writeSymbol(symbol, writer, enclosingDeclaration, meaning);
1009955

1010956
var result = writer.string();
@@ -1013,16 +959,6 @@ module ts {
1013959
return result;
1014960
}
1015961

1016-
function symbolToDisplayParts(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): SymbolDisplayPart[] {
1017-
var writer = getDisplayPartWriter();
1018-
writeSymbol(symbol, writer, enclosingDeclaration, meaning);
1019-
1020-
var result = writer.displayParts();
1021-
releaseDisplayPartWriter(writer);
1022-
1023-
return result;
1024-
}
1025-
1026962
// Enclosing declaration is optional when we don't want to get qualified name in the enclosing declaration scope
1027963
// Meaning needs to be specified if the enclosing declaration is given
1028964
function writeSymbol(symbol: Symbol, writer: SymbolWriter, enclosingDeclaration?: Node, meaning?: SymbolFlags): void {
@@ -1099,12 +1035,8 @@ module ts {
10991035
return writeSymbolName(symbol);
11001036
}
11011037

1102-
function writeSymbolToTextWriter(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags, writer: TextWriter) {
1103-
writer.write(symbolToString(symbol, enclosingDeclaration, meaning));
1104-
}
1105-
11061038
function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
1107-
var writer = getStringWriter();
1039+
var writer = getSingleLineStringWriter();
11081040
writeType(type, writer, enclosingDeclaration, flags);
11091041

11101042
var result = writer.string();
@@ -1118,16 +1050,6 @@ module ts {
11181050
return result;
11191051
}
11201052

1121-
function typeToDisplayParts(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): SymbolDisplayPart[] {
1122-
var writer = getDisplayPartWriter();
1123-
writeType(type, writer, enclosingDeclaration, flags);
1124-
1125-
var result = writer.displayParts();
1126-
releaseDisplayPartWriter(writer);
1127-
1128-
return result;
1129-
}
1130-
11311053
function writeType(type: Type, writer: SymbolWriter, enclosingDeclaration?: Node, flags?: TypeFormatFlags) {
11321054
var typeStack: Type[];
11331055
return writeType(type, /*allowFunctionOrConstructorTypeLiteral*/ true);
@@ -7620,34 +7542,17 @@ module ts {
76207542
return undefined;
76217543
}
76227544

7623-
// Create a single instance that we can wrap the underlying emitter TextWriter with. That
7624-
// way we don't have to allocate a new wrapper every time writeTypeAtLocation and
7625-
// writeReturnTypeOfSignatureDeclaration are called.
7626-
var emitSymbolWriter = {
7627-
writer: <TextWriter>undefined,
7628-
7629-
writeKind: function (text: string) { this.writer.write(text) },
7630-
writeSymbol: function (text: string) { this.writer.write(text) },
7631-
writeLine: function () { this.writer.writeLine() },
7632-
increaseIndent: function () { this.writer.increaseIndent() },
7633-
decreaseIndent: function () { this.writer.decreaseIndent() },
7634-
clear: function () { },
7635-
trackSymbol: function (symbol: Symbol, declaration: Node, meaning: SymbolFlags) { this.writer.trackSymbol(symbol, declaration, meaning) }
7636-
};
7637-
7638-
function writeTypeAtLocation(location: Node, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: TextWriter) {
7545+
function writeTypeAtLocation(location: Node, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter) {
76397546
// Get type of the symbol if this is the valid symbol otherwise get type at location
76407547
var symbol = getSymbolOfNode(location);
76417548
var type = symbol && !(symbol.flags & SymbolFlags.TypeLiteral) ? getTypeOfSymbol(symbol) : getTypeFromTypeNode(location);
76427549

7643-
emitSymbolWriter.writer = writer;
7644-
writeType(type, emitSymbolWriter, enclosingDeclaration, flags);
7550+
writeType(type, writer, enclosingDeclaration, flags);
76457551
}
76467552

7647-
function writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: TextWriter) {
7553+
function writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter) {
76487554
var signature = getSignatureFromDeclaration(signatureDeclaration);
7649-
emitSymbolWriter.writer = writer;
7650-
writeType(getReturnTypeOfSignature(signature), emitSymbolWriter, enclosingDeclaration, flags);
7555+
writeType(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
76517556
}
76527557

76537558
function invokeEmitter(targetSourceFile?: SourceFile) {
@@ -7705,49 +7610,4 @@ module ts {
77057610

77067611
return checker;
77077612
}
7708-
7709-
export function spacePart() {
7710-
return getSymbolDisplayPart(" ", SymbolDisplayPartKind.space, undefined);
7711-
}
7712-
7713-
export function keywordPart(kind: SyntaxKind) {
7714-
return getSymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.keyword, undefined);
7715-
}
7716-
7717-
export function punctuationPart(kind: SyntaxKind) {
7718-
return getSymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.punctuation, undefined);
7719-
}
7720-
7721-
export function operatorPart(kind: SyntaxKind) {
7722-
return getSymbolDisplayPart(tokenToString(kind), SymbolDisplayPartKind.operator, undefined);
7723-
}
7724-
7725-
export function textPart(text: string) {
7726-
return getSymbolDisplayPart(text, SymbolDisplayPartKind.text, undefined);
7727-
}
7728-
7729-
export function symbolPart(text: string, symbol: Symbol) {
7730-
return getSymbolDisplayPart(text, displayPartKind(symbol), symbol)
7731-
}
7732-
7733-
function displayPartKind(symbol: Symbol): SymbolDisplayPartKind {
7734-
var flags = symbol.flags;
7735-
7736-
if (flags & SymbolFlags.Variable) {
7737-
return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter
7738-
? SymbolDisplayPartKind.parameterName
7739-
: SymbolDisplayPartKind.localName;
7740-
}
7741-
else if (flags & SymbolFlags.Property) { return SymbolDisplayPartKind.propertyName; }
7742-
else if (flags & SymbolFlags.EnumMember) { return SymbolDisplayPartKind.enumMemberName; }
7743-
else if (flags & SymbolFlags.Function) { return SymbolDisplayPartKind.functionName; }
7744-
else if (flags & SymbolFlags.Class) { return SymbolDisplayPartKind.className; }
7745-
else if (flags & SymbolFlags.Interface) { return SymbolDisplayPartKind.interfaceName; }
7746-
else if (flags & SymbolFlags.Enum) { return SymbolDisplayPartKind.enumName; }
7747-
else if (flags & SymbolFlags.Module) { return SymbolDisplayPartKind.moduleName; }
7748-
else if (flags & SymbolFlags.Method) { return SymbolDisplayPartKind.methodName; }
7749-
else if (flags & SymbolFlags.TypeParameter) { return SymbolDisplayPartKind.typeParameterName; }
7750-
7751-
return SymbolDisplayPartKind.text;
7752-
}
77537613
}

src/compiler/emitter.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
/// <reference path="parser.ts"/>
55

66
module ts {
7-
interface EmitTextWriter extends TextWriter {
7+
interface EmitTextWriter extends SymbolWriter {
8+
write(s: string): void;
9+
getText(): string;
810
rawWrite(s: string): void;
911
writeLiteral(s: string): void;
1012
getTextPos(): number;
@@ -14,7 +16,7 @@ module ts {
1416
}
1517

1618
var indentStrings: string[] = ["", " "];
17-
function getIndentString(level: number) {
19+
export function getIndentString(level: number) {
1820
if (indentStrings[level] === undefined) {
1921
indentStrings[level] = getIndentString(level - 1) + indentStrings[1];
2022
}
@@ -147,9 +149,17 @@ module ts {
147149
}
148150
}
149151

152+
function writeKind(text: string, kind: SymbolDisplayPartKind) {
153+
write(text);
154+
}
155+
function writeSymbol(text: string, symbol: Symbol) {
156+
write(text);
157+
}
150158
return {
151159
write: write,
152160
trackSymbol: trackSymbol,
161+
writeKind: writeKind,
162+
writeSymbol: writeSymbol,
153163
rawWrite: rawWrite,
154164
writeLiteral: writeLiteral,
155165
writeLine: writeLine,
@@ -160,6 +170,7 @@ module ts {
160170
getLine: () => lineCount + 1,
161171
getColumn: () => lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1,
162172
getText: () => output,
173+
clear: () => { }
163174
};
164175
}
165176

src/compiler/types.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -643,9 +643,9 @@ module ts {
643643
getTypeOfNode(node: Node): Type;
644644
getApparentType(type: Type): ApparentType;
645645
typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string;
646+
writeType(type: Type, writer: SymbolWriter, enclosingDeclaration?: Node, flags?: TypeFormatFlags): void;
646647
symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): string;
647-
typeToDisplayParts(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): SymbolDisplayPart[];
648-
symbolToDisplayParts(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): SymbolDisplayPart[];
648+
writeSymbol(symbol: Symbol, writer: SymbolWriter, enclosingDeclaration?: Node, meaning?: SymbolFlags): void;
649649
getFullyQualifiedName(symbol: Symbol): string;
650650
getAugmentedPropertiesOfApparentType(type: Type): Symbol[];
651651
getRootSymbol(symbol: Symbol): Symbol;
@@ -659,13 +659,18 @@ module ts {
659659
isValidPropertyAccess(node: PropertyAccess, propertyName: string): boolean;
660660
}
661661

662-
export interface TextWriter {
663-
write(s: string): void;
664-
trackSymbol(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): void;
662+
export interface SymbolWriter {
663+
writeKind(text: string, kind: SymbolDisplayPartKind): void;
664+
writeSymbol(text: string, symbol: Symbol): void;
665665
writeLine(): void;
666666
increaseIndent(): void;
667667
decreaseIndent(): void;
668-
getText(): string;
668+
clear(): void;
669+
670+
// Called when the symbol writer encounters a symbol to write. Currently only used by the
671+
// declaration emitter to help determine if it should patch up the final declaration file
672+
// with import statements it previously saw (but chose not to emit).
673+
trackSymbol(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags): void;
669674
}
670675

671676
export enum TypeFormatFlags {
@@ -701,8 +706,8 @@ module ts {
701706
hasSemanticErrors(): boolean;
702707
isDeclarationVisible(node: Declaration): boolean;
703708
isImplementationOfOverload(node: FunctionDeclaration): boolean;
704-
writeTypeAtLocation(location: Node, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: TextWriter): void;
705-
writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: TextWriter): void;
709+
writeTypeAtLocation(location: Node, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;
710+
writeReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: TypeFormatFlags, writer: SymbolWriter): void;
706711
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags): SymbolAccessiblityResult;
707712
isImportDeclarationEntityNameReferenceDeclarationVisibile(entityName: EntityName): SymbolAccessiblityResult;
708713

@@ -1190,11 +1195,6 @@ module ts {
11901195
verticalTab = 0x0B, // \v
11911196
}
11921197

1193-
export interface SymbolDisplayPart {
1194-
text: string;
1195-
kind: SymbolDisplayPartKind;
1196-
}
1197-
11981198
export enum SymbolDisplayPartKind {
11991199
aliasName,
12001200
className,

0 commit comments

Comments
 (0)