mirror of
https://github.com/microsoft/pyright.git
synced 2024-09-11 16:06:39 +03:00
Added config options strictListInference and strictDictionaryInference.
This commit is contained in:
parent
768cb3f2c2
commit
7d5ff66df2
@ -61,6 +61,18 @@
|
|||||||
],
|
],
|
||||||
"pattern": "^(.*)$"
|
"pattern": "^(.*)$"
|
||||||
},
|
},
|
||||||
|
"strictListInference": {
|
||||||
|
"$id": "#/properties/strictListInference",
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Infer strict types for list expressions",
|
||||||
|
"default": "false"
|
||||||
|
},
|
||||||
|
"strictDictionaryInference": {
|
||||||
|
"$id": "#/properties/strictDictionaryInference",
|
||||||
|
"type": "boolean",
|
||||||
|
"title": "Infer strict types for dictionary expressions",
|
||||||
|
"default": "false"
|
||||||
|
},
|
||||||
"reportTypeshedErrors": {
|
"reportTypeshedErrors": {
|
||||||
"$id": "#/properties/reportTypeshedErrors",
|
"$id": "#/properties/reportTypeshedErrors",
|
||||||
"$ref": "#/definitions/diagnostic",
|
"$ref": "#/definitions/diagnostic",
|
||||||
|
@ -28,6 +28,10 @@ Pyright offers flexible configuration options specified in a JSON-formatted text
|
|||||||
## Type Check Diagnostics Settings
|
## Type Check Diagnostics Settings
|
||||||
The following settings control pyright's diagnostic output (warnings or errors). Unless otherwise specified, each diagnostic setting can specify a boolean value (`false` indicating that no error is generated and `true` indicating that an error is generated). Alternatively, a string value of `"none"`, `"warning"`, or `"error"` can be used to specify the diagnostic level.
|
The following settings control pyright's diagnostic output (warnings or errors). Unless otherwise specified, each diagnostic setting can specify a boolean value (`false` indicating that no error is generated and `true` indicating that an error is generated). Alternatively, a string value of `"none"`, `"warning"`, or `"error"` can be used to specify the diagnostic level.
|
||||||
|
|
||||||
|
**strictListInference** [boolean]: When inferring the type of a list, use strict type assumptions. For example, the expression `[1, 'a', 3.4]` could be inferred to be of type `List[Any]` or `List[Union[int, str, float]]`. If this setting is true, it will use the latter (stricter) type. The default value for this setting is 'false'.
|
||||||
|
|
||||||
|
**strictDictionaryInference** [boolean]: When inferring the type of a dictionary’s keys and values, use strict type assumptions. For example, the expression `{'a': 1, 'b': 'a'}` could be inferred to be of type `Dict[str, Any]` or `Dict[str, Union[int, str]]`. If this setting is true, it will use the latter (stricter) type. The default value for this setting is 'false'.
|
||||||
|
|
||||||
**reportTypeshedErrors** [boolean or string, optional]: Generate or suppress diagnostics for typeshed type stub files. In general, these type stub files should be “clean” and generate no errors. The default value for this setting is 'none'.
|
**reportTypeshedErrors** [boolean or string, optional]: Generate or suppress diagnostics for typeshed type stub files. In general, these type stub files should be “clean” and generate no errors. The default value for this setting is 'none'.
|
||||||
|
|
||||||
**reportMissingImports** [boolean or string, optional]: Generate or suppress diagnostics for imports that have no corresponding imported python file or type stub file. The default value for this setting is 'none', although pyright can do a much better job of static type checking if type stub files are provided for all imports.
|
**reportMissingImports** [boolean or string, optional]: Generate or suppress diagnostics for imports that have no corresponding imported python file or type stub file. The default value for this setting is 'none', although pyright can do a much better job of static type checking if type stub files are provided for all imports.
|
||||||
|
@ -2403,12 +2403,17 @@ export class ExpressionEvaluator {
|
|||||||
|
|
||||||
keyType = keyTypes.length > 0 ? TypeUtils.combineTypes(keyTypes) : AnyType.create();
|
keyType = keyTypes.length > 0 ? TypeUtils.combineTypes(keyTypes) : AnyType.create();
|
||||||
|
|
||||||
// If the value type differs, we need to back off because we can't
|
// If the value type differs and we're not using "strict inference mode",
|
||||||
// properly represent the mappings between different keys and associated
|
// we need to back off because we can't properly represent the mappings
|
||||||
// value types. If all the values are the same type, we'll assume that
|
// between different keys and associated value types. If all the values
|
||||||
// all values in this dictionary should be the same.
|
// are the same type, we'll assume that all values in this dictionary should
|
||||||
|
// be the same.
|
||||||
if (valueTypes.length > 0) {
|
if (valueTypes.length > 0) {
|
||||||
valueType = TypeUtils.areTypesSame(valueTypes) ? valueTypes[0] : UnknownType.create();
|
if (this._fileInfo.configOptions.strictDictionaryInference || this._fileInfo.useStrictMode) {
|
||||||
|
valueType = TypeUtils.combineTypes(valueTypes);
|
||||||
|
} else {
|
||||||
|
valueType = TypeUtils.areTypesSame(valueTypes) ? valueTypes[0] : UnknownType.create();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
valueType = AnyType.create();
|
valueType = AnyType.create();
|
||||||
}
|
}
|
||||||
@ -2428,11 +2433,13 @@ export class ExpressionEvaluator {
|
|||||||
const entryTypes = node.entries.map(
|
const entryTypes = node.entries.map(
|
||||||
entry => TypeUtils.stripLiteralValue(this.getType(entry)));
|
entry => TypeUtils.stripLiteralValue(this.getType(entry)));
|
||||||
|
|
||||||
// If the list contains only one type, we'll assume the list is
|
|
||||||
// homogeneous. Otherwise, we'll avoid making assumptions about
|
|
||||||
// the list entry type.
|
|
||||||
if (entryTypes.length > 0) {
|
if (entryTypes.length > 0) {
|
||||||
listEntryType = TypeUtils.areTypesSame(entryTypes) ? entryTypes[0] : UnknownType.create();
|
if (this._fileInfo.configOptions.strictListInference || this._fileInfo.useStrictMode) {
|
||||||
|
listEntryType = TypeUtils.combineTypes(entryTypes);
|
||||||
|
} else {
|
||||||
|
// Is the list homogeneous? If so, use stricter rules. Otherwise relax the rules.
|
||||||
|
listEntryType = TypeUtils.areTypesSame(entryTypes) ? entryTypes[0] : UnknownType.create();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +79,12 @@ export class ConfigOptions {
|
|||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
// Diagnostics Settings
|
// Diagnostics Settings
|
||||||
|
|
||||||
|
// Use strict inference rules for list expressions?
|
||||||
|
strictListInference = false;
|
||||||
|
|
||||||
|
// Use strict inference rules for dictionary expressions?
|
||||||
|
strictDictionaryInference = false;
|
||||||
|
|
||||||
// Report diagnostics in typeshed files?
|
// Report diagnostics in typeshed files?
|
||||||
reportTypeshedErrors: DiagnosticLevel = 'none';
|
reportTypeshedErrors: DiagnosticLevel = 'none';
|
||||||
|
|
||||||
@ -244,6 +250,14 @@ export class ConfigOptions {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use strict inference rules for list expressions?
|
||||||
|
this.strictListInference = this._convertBoolean(
|
||||||
|
configObj.strictListInference, 'strictListInference', false);
|
||||||
|
|
||||||
|
// Use strict inference rules for dictionary expressions?
|
||||||
|
this.strictDictionaryInference = this._convertBoolean(
|
||||||
|
configObj.strictDictionaryInference, 'strictDictionaryInference', false);
|
||||||
|
|
||||||
// Read the "reportTypeshedErrors" entry.
|
// Read the "reportTypeshedErrors" entry.
|
||||||
this.reportTypeshedErrors = this._convertDiagnosticLevel(
|
this.reportTypeshedErrors = this._convertDiagnosticLevel(
|
||||||
configObj.reportTypeshedErrors, 'reportTypeshedErrors', 'none');
|
configObj.reportTypeshedErrors, 'reportTypeshedErrors', 'none');
|
||||||
@ -419,6 +433,17 @@ export class ConfigOptions {
|
|||||||
return absolutePath;
|
return absolutePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private _convertBoolean(value: any, fieldName: string, defaultValue: boolean): boolean {
|
||||||
|
if (value === undefined) {
|
||||||
|
return defaultValue;
|
||||||
|
} else if (typeof value === 'boolean') {
|
||||||
|
return value ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Config "${ fieldName }" entry must be true or false.`);
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
private _convertDiagnosticLevel(value: any, fieldName: string,
|
private _convertDiagnosticLevel(value: any, fieldName: string,
|
||||||
defaultValue: DiagnosticLevel): DiagnosticLevel {
|
defaultValue: DiagnosticLevel): DiagnosticLevel {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user