fix(compiler): Update types for TypeScript nullability support
This commit is contained in:
@ -65,7 +65,7 @@ export abstract class CssRuleAst extends CssAst {
|
||||
export class CssBlockRuleAst extends CssRuleAst {
|
||||
constructor(
|
||||
public location: ParseSourceSpan, public type: BlockType, public block: CssBlockAst,
|
||||
public name: CssToken = null) {
|
||||
public name: CssToken|null = null) {
|
||||
super(location);
|
||||
}
|
||||
visit(visitor: CssAstVisitor, context?: any): any {
|
||||
|
@ -40,7 +40,7 @@ export enum CssLexerMode {
|
||||
}
|
||||
|
||||
export class LexedCssResult {
|
||||
constructor(public error: Error, public token: CssToken) {}
|
||||
constructor(public error: Error|null, public token: CssToken) {}
|
||||
}
|
||||
|
||||
export function generateErrorMessage(
|
||||
@ -126,7 +126,7 @@ export class CssScanner {
|
||||
/** @internal */
|
||||
_currentMode: CssLexerMode = CssLexerMode.BLOCK;
|
||||
/** @internal */
|
||||
_currentError: Error = null;
|
||||
_currentError: Error|null = null;
|
||||
|
||||
constructor(public input: string, private _trackComments: boolean = false) {
|
||||
this.length = this.input.length;
|
||||
@ -188,7 +188,7 @@ export class CssScanner {
|
||||
}
|
||||
}
|
||||
|
||||
consume(type: CssTokenType, value: string = null): LexedCssResult {
|
||||
consume(type: CssTokenType, value: string|null = null): LexedCssResult {
|
||||
const mode = this._currentMode;
|
||||
|
||||
this.setMode(_trackWhitespace(mode) ? CssLexerMode.ALL_TRACK_WS : CssLexerMode.ALL);
|
||||
@ -197,7 +197,7 @@ export class CssScanner {
|
||||
const previousLine = this.line;
|
||||
const previousColumn = this.column;
|
||||
|
||||
let next: CssToken;
|
||||
let next: CssToken = undefined !;
|
||||
const output = this.scan();
|
||||
if (output != null) {
|
||||
// just incase the inner scan method returned an error
|
||||
@ -225,7 +225,7 @@ export class CssScanner {
|
||||
// mode so that the parser can recover...
|
||||
this.setMode(mode);
|
||||
|
||||
let error: Error = null;
|
||||
let error: Error|null = null;
|
||||
if (!isMatchingType || (value != null && value != next.strValue)) {
|
||||
let errorMessage =
|
||||
CssTokenType[next.type] + ' does not match expected ' + CssTokenType[type] + ' value';
|
||||
@ -244,7 +244,7 @@ export class CssScanner {
|
||||
}
|
||||
|
||||
|
||||
scan(): LexedCssResult {
|
||||
scan(): LexedCssResult|null {
|
||||
const trackWS = _trackWhitespace(this._currentMode);
|
||||
if (this.index == 0 && !trackWS) { // first scan
|
||||
this.consumeWhitespace();
|
||||
@ -253,7 +253,7 @@ export class CssScanner {
|
||||
const token = this._scan();
|
||||
if (token == null) return null;
|
||||
|
||||
const error = this._currentError;
|
||||
const error = this._currentError !;
|
||||
this._currentError = null;
|
||||
|
||||
if (!trackWS) {
|
||||
@ -263,7 +263,7 @@ export class CssScanner {
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
_scan(): CssToken {
|
||||
_scan(): CssToken|null {
|
||||
let peek = this.peek;
|
||||
let peekPeek = this.peekPeek;
|
||||
if (peek == chars.$EOF) return null;
|
||||
@ -317,7 +317,7 @@ export class CssScanner {
|
||||
return this.error(`Unexpected character [${String.fromCharCode(peek)}]`);
|
||||
}
|
||||
|
||||
scanComment(): CssToken {
|
||||
scanComment(): CssToken|null {
|
||||
if (this.assertCondition(
|
||||
isCommentStart(this.peek, this.peekPeek), 'Expected comment start value')) {
|
||||
return null;
|
||||
@ -355,7 +355,7 @@ export class CssScanner {
|
||||
return new CssToken(start, startingColumn, startingLine, CssTokenType.Whitespace, str);
|
||||
}
|
||||
|
||||
scanString(): CssToken {
|
||||
scanString(): CssToken|null {
|
||||
if (this.assertCondition(
|
||||
isStringStart(this.peek, this.peekPeek), 'Unexpected non-string starting value')) {
|
||||
return null;
|
||||
@ -405,7 +405,7 @@ export class CssScanner {
|
||||
return new CssToken(start, startingColumn, this.line, CssTokenType.Number, strValue);
|
||||
}
|
||||
|
||||
scanIdentifier(): CssToken {
|
||||
scanIdentifier(): CssToken|null {
|
||||
if (this.assertCondition(
|
||||
isIdentifierStart(this.peek, this.peekPeek), 'Expected identifier starting value')) {
|
||||
return null;
|
||||
@ -436,7 +436,7 @@ export class CssScanner {
|
||||
return new CssToken(start, startingColumn, this.line, CssTokenType.Identifier, strValue);
|
||||
}
|
||||
|
||||
scanCharacter(): CssToken {
|
||||
scanCharacter(): CssToken|null {
|
||||
const start = this.index;
|
||||
const startingColumn = this.column;
|
||||
if (this.assertCondition(
|
||||
@ -451,7 +451,7 @@ export class CssScanner {
|
||||
return new CssToken(start, startingColumn, this.line, CssTokenType.Character, c);
|
||||
}
|
||||
|
||||
scanAtExpression(): CssToken {
|
||||
scanAtExpression(): CssToken|null {
|
||||
if (this.assertCondition(this.peek == chars.$AT, 'Expected @ value')) {
|
||||
return null;
|
||||
}
|
||||
@ -460,7 +460,7 @@ export class CssScanner {
|
||||
const startingColumn = this.column;
|
||||
this.advance();
|
||||
if (isIdentifierStart(this.peek, this.peekPeek)) {
|
||||
const ident = this.scanIdentifier();
|
||||
const ident = this.scanIdentifier() !;
|
||||
const strValue = '@' + ident.strValue;
|
||||
return new CssToken(start, startingColumn, this.line, CssTokenType.AtKeyword, strValue);
|
||||
} else {
|
||||
@ -476,7 +476,8 @@ export class CssScanner {
|
||||
return false;
|
||||
}
|
||||
|
||||
error(message: string, errorTokenValue: string = null, doNotAdvance: boolean = false): CssToken {
|
||||
error(message: string, errorTokenValue: string|null = null, doNotAdvance: boolean = false):
|
||||
CssToken {
|
||||
const index: number = this.index;
|
||||
const column: number = this.column;
|
||||
const line: number = this.line;
|
||||
|
@ -102,8 +102,8 @@ export class CssParser {
|
||||
this._errors = [];
|
||||
|
||||
const result = new ParsedCssResult(errors, ast);
|
||||
this._file = null;
|
||||
this._scanner = null;
|
||||
this._file = null as any;
|
||||
this._scanner = null as any;
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -115,14 +115,14 @@ export class CssParser {
|
||||
this._scanner.setMode(CssLexerMode.BLOCK);
|
||||
results.push(this._parseRule(delimiters));
|
||||
}
|
||||
let span: ParseSourceSpan = null;
|
||||
let span: ParseSourceSpan|null = null;
|
||||
if (results.length > 0) {
|
||||
const firstRule = results[0];
|
||||
// we collect the last token like so incase there was an
|
||||
// EOF token that was emitted sometime during the lexing
|
||||
span = this._generateSourceSpan(firstRule, this._lastToken);
|
||||
}
|
||||
return new CssStyleSheetAst(span, results);
|
||||
return new CssStyleSheetAst(span !, results);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
@ -134,7 +134,7 @@ export class CssParser {
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
_generateSourceSpan(start: CssToken|CssAst, end: CssToken|CssAst = null): ParseSourceSpan {
|
||||
_generateSourceSpan(start: CssToken|CssAst, end: CssToken|CssAst|null = null): ParseSourceSpan {
|
||||
let startLoc: ParseLocation;
|
||||
if (start instanceof CssAst) {
|
||||
startLoc = start.location.start;
|
||||
@ -152,13 +152,13 @@ export class CssParser {
|
||||
end = this._lastToken;
|
||||
}
|
||||
|
||||
let endLine: number;
|
||||
let endColumn: number;
|
||||
let endIndex: number;
|
||||
let endLine: number = -1;
|
||||
let endColumn: number = -1;
|
||||
let endIndex: number = -1;
|
||||
if (end instanceof CssAst) {
|
||||
endLine = end.location.end.line;
|
||||
endColumn = end.location.end.col;
|
||||
endIndex = end.location.end.offset;
|
||||
endLine = end.location.end.line !;
|
||||
endColumn = end.location.end.col !;
|
||||
endIndex = end.location.end.offset !;
|
||||
} else if (end instanceof CssToken) {
|
||||
endLine = end.line;
|
||||
endColumn = end.column;
|
||||
@ -250,7 +250,7 @@ export class CssParser {
|
||||
|
||||
case BlockType.Viewport:
|
||||
case BlockType.FontFace:
|
||||
block = this._parseStyleBlock(delimiters);
|
||||
block = this._parseStyleBlock(delimiters) !;
|
||||
span = this._generateSourceSpan(startToken, block);
|
||||
return new CssBlockRuleAst(span, type, block);
|
||||
|
||||
@ -290,7 +290,7 @@ export class CssParser {
|
||||
span = this._generateSourceSpan(startToken, tokens[tokens.length - 1]);
|
||||
query = new CssAtRulePredicateAst(span, strValue, tokens);
|
||||
block = this._parseBlock(delimiters);
|
||||
strValue = this._extractSourceContent(start, block.end.offset);
|
||||
strValue = this._extractSourceContent(start, block.end.offset !);
|
||||
span = this._generateSourceSpan(startToken, block);
|
||||
return new CssBlockDefinitionRuleAst(span, strValue, type, query, block);
|
||||
|
||||
@ -373,7 +373,7 @@ export class CssParser {
|
||||
|
||||
/** @internal */
|
||||
_scan(): CssToken {
|
||||
const output = this._scanner.scan();
|
||||
const output = this._scanner.scan() !;
|
||||
const token = output.token;
|
||||
const error = output.error;
|
||||
if (error != null) {
|
||||
@ -387,7 +387,7 @@ export class CssParser {
|
||||
_getScannerIndex(): number { return this._scanner.index; }
|
||||
|
||||
/** @internal */
|
||||
_consume(type: CssTokenType, value: string = null): CssToken {
|
||||
_consume(type: CssTokenType, value: string|null = null): CssToken {
|
||||
const output = this._scanner.consume(type, value);
|
||||
const token = output.token;
|
||||
const error = output.error;
|
||||
@ -429,7 +429,7 @@ export class CssParser {
|
||||
}
|
||||
const stylesBlock = this._parseStyleBlock(delimiters | RBRACE_DELIM_FLAG);
|
||||
const span = this._generateSourceSpan(stepTokens[0], stylesBlock);
|
||||
const ast = new CssKeyframeDefinitionAst(span, stepTokens, stylesBlock);
|
||||
const ast = new CssKeyframeDefinitionAst(span, stepTokens, stylesBlock !);
|
||||
|
||||
this._scanner.setMode(CssLexerMode.BLOCK);
|
||||
return ast;
|
||||
@ -520,7 +520,7 @@ export class CssParser {
|
||||
const selectorCssTokens: CssToken[] = [];
|
||||
const pseudoSelectors: CssPseudoSelectorAst[] = [];
|
||||
|
||||
let previousToken: CssToken;
|
||||
let previousToken: CssToken = undefined !;
|
||||
|
||||
const selectorPartDelimiters = delimiters | SPACE_DELIM_FLAG;
|
||||
let loopOverSelector = !characterContainsDelimiter(this._scanner.peek, selectorPartDelimiters);
|
||||
@ -581,9 +581,9 @@ export class CssParser {
|
||||
|
||||
// this happens if the selector is not directly followed by
|
||||
// a comma or curly brace without a space in between
|
||||
let operator: CssToken = null;
|
||||
let operator: CssToken|null = null;
|
||||
let operatorScanCount = 0;
|
||||
let lastOperatorToken: CssToken = null;
|
||||
let lastOperatorToken: CssToken|null = null;
|
||||
if (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
||||
while (operator == null && !characterContainsDelimiter(this._scanner.peek, delimiters) &&
|
||||
isSelectorOperatorCharacter(this._scanner.peek)) {
|
||||
@ -653,8 +653,8 @@ export class CssParser {
|
||||
|
||||
// please note that `endToken` is reassigned multiple times below
|
||||
// so please do not optimize the if statements into if/elseif
|
||||
let startTokenOrAst: CssToken|CssAst = null;
|
||||
let endTokenOrAst: CssToken|CssAst = null;
|
||||
let startTokenOrAst: CssToken|CssAst|null = null;
|
||||
let endTokenOrAst: CssToken|CssAst|null = null;
|
||||
if (selectorCssTokens.length > 0) {
|
||||
startTokenOrAst = startTokenOrAst || selectorCssTokens[0];
|
||||
endTokenOrAst = selectorCssTokens[selectorCssTokens.length - 1];
|
||||
@ -668,8 +668,8 @@ export class CssParser {
|
||||
endTokenOrAst = operator;
|
||||
}
|
||||
|
||||
const span = this._generateSourceSpan(startTokenOrAst, endTokenOrAst);
|
||||
return new CssSimpleSelectorAst(span, selectorCssTokens, strValue, pseudoSelectors, operator);
|
||||
const span = this._generateSourceSpan(startTokenOrAst !, endTokenOrAst);
|
||||
return new CssSimpleSelectorAst(span, selectorCssTokens, strValue, pseudoSelectors, operator !);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
@ -698,7 +698,7 @@ export class CssParser {
|
||||
|
||||
const tokens: CssToken[] = [];
|
||||
let wsStr = '';
|
||||
let previous: CssToken;
|
||||
let previous: CssToken = undefined !;
|
||||
while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
||||
let token: CssToken;
|
||||
if (previous != null && previous.type == CssTokenType.Identifier &&
|
||||
@ -749,7 +749,7 @@ export class CssParser {
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
_collectUntilDelim(delimiters: number, assertType: CssTokenType = null): CssToken[] {
|
||||
_collectUntilDelim(delimiters: number, assertType: CssTokenType|null = null): CssToken[] {
|
||||
const tokens: CssToken[] = [];
|
||||
while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
||||
const val = assertType != null ? this._consume(assertType) : this._scan();
|
||||
@ -782,7 +782,7 @@ export class CssParser {
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
_parseStyleBlock(delimiters: number): CssStylesBlockAst {
|
||||
_parseStyleBlock(delimiters: number): CssStylesBlockAst|null {
|
||||
delimiters |= RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG;
|
||||
|
||||
this._scanner.setMode(CssLexerMode.STYLE_BLOCK);
|
||||
@ -815,7 +815,7 @@ export class CssParser {
|
||||
|
||||
let prop = this._consume(CssTokenType.Identifier);
|
||||
let parseValue: boolean = false;
|
||||
let value: CssStyleValueAst = null;
|
||||
let value: CssStyleValueAst|null = null;
|
||||
let endToken: CssToken|CssStyleValueAst = prop;
|
||||
|
||||
// the colon value separates the prop from the style.
|
||||
@ -865,7 +865,7 @@ export class CssParser {
|
||||
}
|
||||
|
||||
const span = this._generateSourceSpan(prop, endToken);
|
||||
return new CssDefinitionAst(span, prop, value);
|
||||
return new CssDefinitionAst(span, prop, value !);
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
|
Reference in New Issue
Block a user