Merge pull request #1418 from Microsoft/suppressNoImplicitAnyErrors

Suppress no implicit any errors
This commit is contained in:
Mohamed Hegazy 2014-12-10 18:46:39 -08:00
commit b4082cec1b
14 changed files with 311 additions and 39 deletions

View file

@ -5335,7 +5335,7 @@ module ts {
}
// Fall back to any.
if (compilerOptions.noImplicitAny && objectType !== anyType) {
if (compilerOptions.noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && objectType !== anyType) {
error(node, Diagnostics.Index_signature_of_object_type_implicitly_has_an_any_type);
}

View file

@ -88,6 +88,11 @@ module ts {
description: Diagnostics.Redirect_output_structure_to_the_directory,
paramType: Diagnostics.DIRECTORY,
},
{
name: "preserveConstEnums",
type: "boolean",
description: Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
},
{
name: "removeComments",
type: "boolean",
@ -104,6 +109,11 @@ module ts {
description: Diagnostics.Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations,
paramType: Diagnostics.LOCATION,
},
{
name: "suppressImplicitAnyIndexErrors",
type: "boolean",
description: Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures,
},
{
name: "target",
shortName: "t",
@ -124,13 +134,8 @@ module ts {
type: "boolean",
description: Diagnostics.Watch_input_files,
},
{
name: "preserveConstEnums",
type: "boolean",
description: Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
}
];
var shortOptionNames: Map<string> = {};
var optionNameMap: Map<CommandLineOption> = {};

View file

@ -411,6 +411,7 @@ module ts {
Warn_on_expressions_and_declarations_with_an_implied_any_type: { code: 6052, category: DiagnosticCategory.Message, key: "Warn on expressions and declarations with an implied 'any' type." },
File_0_not_found: { code: 6053, category: DiagnosticCategory.Error, key: "File '{0}' not found." },
File_0_must_have_extension_ts_or_d_ts: { code: 6054, category: DiagnosticCategory.Error, key: "File '{0}' must have extension '.ts' or '.d.ts'." },
Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },

View file

@ -1643,6 +1643,10 @@
"category": "Error",
"code": 6054
},
"Suppress noImplicitAny errors for indexing objects lacking index signatures.": {
"category": "Message",
"code": 6055
},
"Variable '{0}' implicitly has an '{1}' type.": {
"category": "Error",

View file

@ -378,12 +378,12 @@ module ts {
var usageText = " ";
if (option.shortName) {
usageText += "-" + option.shortName;
usageText += getParamName(option);
usageText += getParamType(option);
usageText += ", ";
}
usageText += "--" + option.name;
usageText += getParamName(option);
usageText += getParamType(option);
usageColumn.push(usageText);
descriptionColumn.push(getDiagnosticText(option.description));
@ -408,9 +408,9 @@ module ts {
sys.write(output);
return;
function getParamName(option: CommandLineOption) {
if (option.paramName !== undefined) {
return " " + getDiagnosticText(option.paramName);
function getParamType(option: CommandLineOption) {
if (option.paramType !== undefined) {
return " " + getDiagnosticText(option.paramType);
}
return "";
}

View file

@ -1358,6 +1358,7 @@ module ts {
}
export interface CompilerOptions {
allowNonTsExtensions?: boolean;
charset?: string;
codepage?: number;
declaration?: boolean;
@ -1375,14 +1376,14 @@ module ts {
noResolve?: boolean;
out?: string;
outDir?: string;
preserveConstEnums?: boolean;
removeComments?: boolean;
sourceMap?: boolean;
sourceRoot?: string;
suppressImplicitAnyIndexErrors?: boolean;
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
preserveConstEnums?: boolean;
allowNonTsExtensions?: boolean;
[option: string]: string | number | boolean;
}
@ -1419,7 +1420,7 @@ module ts {
type: string | Map<number>; // "string", "number", "boolean", or an object literal mapping named values to actual values
shortName?: string; // A short mnemonic for convenience - for instance, 'h' can be used in place of 'help'.
description?: DiagnosticMessage; // The message describing what the command line switch does
paramName?: DiagnosticMessage; // The name to be used for a non-boolean option's parameter.
paramType?: DiagnosticMessage; // The name to be used for a non-boolean option's parameter.
error?: DiagnosticMessage; // The error given when the argument does not fit a customized 'type'.
}
@ -1557,7 +1558,7 @@ module ts {
tab = 0x09, // \t
verticalTab = 0x0B, // \v
}
export interface CancellationToken {
isCancellationRequested(): boolean;
}

View file

@ -781,6 +781,10 @@ module Harness {
options.preserveConstEnums = setting.value === 'true';
break;
case 'suppressimplicitanyindexerrors':
options.suppressImplicitAnyIndexErrors = setting.value === 'true';
break;
case 'includebuiltfile':
inputFiles.push({ unitName: setting.value, content: IO.readFile(libFolder + setting.value)});
break;
@ -1170,7 +1174,8 @@ module Harness {
var optionRegex = /^[\/]{2}\s*@(\w+)\s*:\s*(\S*)/gm; // multiple matches on multiple lines
// List of allowed metadata names
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noemitonerror", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation", "usecasesensitivefilenames", "preserveconstenums", "includebuiltfile"];
var fileMetadataNames = ["filename", "comments", "declaration", "module", "nolib", "sourcemap", "target", "out", "outdir", "noemitonerror", "noimplicitany", "noresolve", "newline", "newlines", "emitbom", "errortruncation", "usecasesensitivefilenames", "preserveconstenums", "includebuiltfile", "suppressimplicitanyindexerrors"];
function extractCompilerSettings(content: string): CompilerSetting[] {

View file

@ -1094,6 +1094,7 @@ declare module "typescript" {
Message = 2,
}
interface CompilerOptions {
allowNonTsExtensions?: boolean;
charset?: string;
codepage?: number;
declaration?: boolean;
@ -1111,14 +1112,14 @@ declare module "typescript" {
noResolve?: boolean;
out?: string;
outDir?: string;
preserveConstEnums?: boolean;
removeComments?: boolean;
sourceMap?: boolean;
sourceRoot?: string;
suppressImplicitAnyIndexErrors?: boolean;
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
preserveConstEnums?: boolean;
allowNonTsExtensions?: boolean;
[option: string]: string | number | boolean;
}
const enum ModuleKind {
@ -1146,7 +1147,7 @@ declare module "typescript" {
type: string | Map<number>;
shortName?: string;
description?: DiagnosticMessage;
paramName?: DiagnosticMessage;
paramType?: DiagnosticMessage;
error?: DiagnosticMessage;
}
const enum CharacterCodes {

View file

@ -3483,6 +3483,9 @@ declare module "typescript" {
interface CompilerOptions {
>CompilerOptions : CompilerOptions
allowNonTsExtensions?: boolean;
>allowNonTsExtensions : boolean
charset?: string;
>charset : string
@ -3535,6 +3538,9 @@ declare module "typescript" {
outDir?: string;
>outDir : string
preserveConstEnums?: boolean;
>preserveConstEnums : boolean
removeComments?: boolean;
>removeComments : boolean
@ -3544,6 +3550,9 @@ declare module "typescript" {
sourceRoot?: string;
>sourceRoot : string
suppressImplicitAnyIndexErrors?: boolean;
>suppressImplicitAnyIndexErrors : boolean
target?: ScriptTarget;
>target : ScriptTarget
>ScriptTarget : ScriptTarget
@ -3554,12 +3563,6 @@ declare module "typescript" {
watch?: boolean;
>watch : boolean
preserveConstEnums?: boolean;
>preserveConstEnums : boolean
allowNonTsExtensions?: boolean;
>allowNonTsExtensions : boolean
[option: string]: string | number | boolean;
>option : string
}
@ -3630,8 +3633,8 @@ declare module "typescript" {
>description : DiagnosticMessage
>DiagnosticMessage : DiagnosticMessage
paramName?: DiagnosticMessage;
>paramName : DiagnosticMessage
paramType?: DiagnosticMessage;
>paramType : DiagnosticMessage
>DiagnosticMessage : DiagnosticMessage
error?: DiagnosticMessage;

View file

@ -1092,6 +1092,7 @@ declare module ts {
Message = 2,
}
interface CompilerOptions {
allowNonTsExtensions?: boolean;
charset?: string;
codepage?: number;
declaration?: boolean;
@ -1109,14 +1110,14 @@ declare module ts {
noResolve?: boolean;
out?: string;
outDir?: string;
preserveConstEnums?: boolean;
removeComments?: boolean;
sourceMap?: boolean;
sourceRoot?: string;
suppressImplicitAnyIndexErrors?: boolean;
target?: ScriptTarget;
version?: boolean;
watch?: boolean;
preserveConstEnums?: boolean;
allowNonTsExtensions?: boolean;
[option: string]: string | number | boolean;
}
const enum ModuleKind {
@ -1144,7 +1145,7 @@ declare module ts {
type: string | Map<number>;
shortName?: string;
description?: DiagnosticMessage;
paramName?: DiagnosticMessage;
paramType?: DiagnosticMessage;
error?: DiagnosticMessage;
}
const enum CharacterCodes {

View file

@ -3482,6 +3482,9 @@ declare module ts {
interface CompilerOptions {
>CompilerOptions : CompilerOptions
allowNonTsExtensions?: boolean;
>allowNonTsExtensions : boolean
charset?: string;
>charset : string
@ -3534,6 +3537,9 @@ declare module ts {
outDir?: string;
>outDir : string
preserveConstEnums?: boolean;
>preserveConstEnums : boolean
removeComments?: boolean;
>removeComments : boolean
@ -3543,6 +3549,9 @@ declare module ts {
sourceRoot?: string;
>sourceRoot : string
suppressImplicitAnyIndexErrors?: boolean;
>suppressImplicitAnyIndexErrors : boolean
target?: ScriptTarget;
>target : ScriptTarget
>ScriptTarget : ScriptTarget
@ -3553,12 +3562,6 @@ declare module ts {
watch?: boolean;
>watch : boolean
preserveConstEnums?: boolean;
>preserveConstEnums : boolean
allowNonTsExtensions?: boolean;
>allowNonTsExtensions : boolean
[option: string]: string | number | boolean;
>option : string
}
@ -3629,8 +3632,8 @@ declare module ts {
>description : DiagnosticMessage
>DiagnosticMessage : DiagnosticMessage
paramName?: DiagnosticMessage;
>paramName : DiagnosticMessage
paramType?: DiagnosticMessage;
>paramType : DiagnosticMessage
>DiagnosticMessage : DiagnosticMessage
error?: DiagnosticMessage;

View file

@ -0,0 +1,81 @@
//// [noImplicitAnyIndexingSuppressed.ts]
enum MyEmusEnum {
emu
}
// Should be okay; should be a string.
var strRepresentation1 = MyEmusEnum[0]
// Should be okay; should be a string.
var strRepresentation2 = MyEmusEnum[MyEmusEnum.emu]
// Should be okay, as we suppress implicit 'any' property access checks
var strRepresentation3 = MyEmusEnum["monehh"];
// Should be okay; should be a MyEmusEnum
var strRepresentation4 = MyEmusEnum["emu"];
// Should be okay, as we suppress implicit 'any' property access checks
var x = {}["hi"];
// Should be okay, as we suppress implicit 'any' property access checks
var y = {}[10];
var hi: any = "hi";
var emptyObj = {};
// Should be okay, as we suppress implicit 'any' property access checks
var z1 = emptyObj[hi];
var z2 = (<any>emptyObj)[hi];
interface MyMap<T> {
[key: string]: T;
}
var m: MyMap<number> = {
"0": 0,
"1": 1,
"2": 2,
"Okay that's enough for today.": NaN
};
var mResult1 = m[MyEmusEnum.emu];
var mResult2 = m[MyEmusEnum[MyEmusEnum.emu]];
var mResult3 = m[hi];
//// [noImplicitAnyIndexingSuppressed.js]
var MyEmusEnum;
(function (MyEmusEnum) {
MyEmusEnum[MyEmusEnum["emu"] = 0] = "emu";
})(MyEmusEnum || (MyEmusEnum = {}));
// Should be okay; should be a string.
var strRepresentation1 = MyEmusEnum[0];
// Should be okay; should be a string.
var strRepresentation2 = MyEmusEnum[0 /* emu */];
// Should be okay, as we suppress implicit 'any' property access checks
var strRepresentation3 = MyEmusEnum["monehh"];
// Should be okay; should be a MyEmusEnum
var strRepresentation4 = 0 /* "emu" */;
// Should be okay, as we suppress implicit 'any' property access checks
var x = {}["hi"];
// Should be okay, as we suppress implicit 'any' property access checks
var y = {}[10];
var hi = "hi";
var emptyObj = {};
// Should be okay, as we suppress implicit 'any' property access checks
var z1 = emptyObj[hi];
var z2 = emptyObj[hi];
var m = {
"0": 0,
"1": 1,
"2": 2,
"Okay that's enough for today.": NaN
};
var mResult1 = m[0 /* emu */];
var mResult2 = m[MyEmusEnum[0 /* emu */]];
var mResult3 = m[hi];

View file

@ -0,0 +1,118 @@
=== tests/cases/compiler/noImplicitAnyIndexingSuppressed.ts ===
enum MyEmusEnum {
>MyEmusEnum : MyEmusEnum
emu
>emu : MyEmusEnum
}
// Should be okay; should be a string.
var strRepresentation1 = MyEmusEnum[0]
>strRepresentation1 : string
>MyEmusEnum[0] : string
>MyEmusEnum : typeof MyEmusEnum
// Should be okay; should be a string.
var strRepresentation2 = MyEmusEnum[MyEmusEnum.emu]
>strRepresentation2 : string
>MyEmusEnum[MyEmusEnum.emu] : string
>MyEmusEnum : typeof MyEmusEnum
>MyEmusEnum.emu : MyEmusEnum
>MyEmusEnum : typeof MyEmusEnum
>emu : MyEmusEnum
// Should be okay, as we suppress implicit 'any' property access checks
var strRepresentation3 = MyEmusEnum["monehh"];
>strRepresentation3 : any
>MyEmusEnum["monehh"] : any
>MyEmusEnum : typeof MyEmusEnum
// Should be okay; should be a MyEmusEnum
var strRepresentation4 = MyEmusEnum["emu"];
>strRepresentation4 : MyEmusEnum
>MyEmusEnum["emu"] : MyEmusEnum
>MyEmusEnum : typeof MyEmusEnum
// Should be okay, as we suppress implicit 'any' property access checks
var x = {}["hi"];
>x : any
>{}["hi"] : any
>{} : {}
// Should be okay, as we suppress implicit 'any' property access checks
var y = {}[10];
>y : any
>{}[10] : any
>{} : {}
var hi: any = "hi";
>hi : any
var emptyObj = {};
>emptyObj : {}
>{} : {}
// Should be okay, as we suppress implicit 'any' property access checks
var z1 = emptyObj[hi];
>z1 : any
>emptyObj[hi] : any
>emptyObj : {}
>hi : any
var z2 = (<any>emptyObj)[hi];
>z2 : any
>(<any>emptyObj)[hi] : any
>(<any>emptyObj) : any
><any>emptyObj : any
>emptyObj : {}
>hi : any
interface MyMap<T> {
>MyMap : MyMap<T>
>T : T
[key: string]: T;
>key : string
>T : T
}
var m: MyMap<number> = {
>m : MyMap<number>
>MyMap : MyMap<T>
>{ "0": 0, "1": 1, "2": 2, "Okay that's enough for today.": NaN} : { [x: string]: number; "0": number; "1": number; "2": number; "Okay that's enough for today.": number; }
"0": 0,
"1": 1,
"2": 2,
"Okay that's enough for today.": NaN
>NaN : number
};
var mResult1 = m[MyEmusEnum.emu];
>mResult1 : number
>m[MyEmusEnum.emu] : number
>m : MyMap<number>
>MyEmusEnum.emu : MyEmusEnum
>MyEmusEnum : typeof MyEmusEnum
>emu : MyEmusEnum
var mResult2 = m[MyEmusEnum[MyEmusEnum.emu]];
>mResult2 : number
>m[MyEmusEnum[MyEmusEnum.emu]] : number
>m : MyMap<number>
>MyEmusEnum[MyEmusEnum.emu] : string
>MyEmusEnum : typeof MyEmusEnum
>MyEmusEnum.emu : MyEmusEnum
>MyEmusEnum : typeof MyEmusEnum
>emu : MyEmusEnum
var mResult3 = m[hi];
>mResult3 : number
>m[hi] : number
>m : MyMap<number>
>hi : any

View file

@ -0,0 +1,49 @@
//@noImplicitAny: true
//@suppressImplicitAnyIndexErrors: true
enum MyEmusEnum {
emu
}
// Should be okay; should be a string.
var strRepresentation1 = MyEmusEnum[0]
// Should be okay; should be a string.
var strRepresentation2 = MyEmusEnum[MyEmusEnum.emu]
// Should be okay, as we suppress implicit 'any' property access checks
var strRepresentation3 = MyEmusEnum["monehh"];
// Should be okay; should be a MyEmusEnum
var strRepresentation4 = MyEmusEnum["emu"];
// Should be okay, as we suppress implicit 'any' property access checks
var x = {}["hi"];
// Should be okay, as we suppress implicit 'any' property access checks
var y = {}[10];
var hi: any = "hi";
var emptyObj = {};
// Should be okay, as we suppress implicit 'any' property access checks
var z1 = emptyObj[hi];
var z2 = (<any>emptyObj)[hi];
interface MyMap<T> {
[key: string]: T;
}
var m: MyMap<number> = {
"0": 0,
"1": 1,
"2": 2,
"Okay that's enough for today.": NaN
};
var mResult1 = m[MyEmusEnum.emu];
var mResult2 = m[MyEmusEnum[MyEmusEnum.emu]];
var mResult3 = m[hi];