Skip to content

Commit d43be18

Browse files
authored
Merge branch 'master' into feat/37409
2 parents 8ed7491 + e60bbac commit d43be18

File tree

60 files changed

+8135
-5966
lines changed

Some content is hidden

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

60 files changed

+8135
-5966
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ scripts/processDiagnosticMessages.js
5353
scripts/produceLKG.js
5454
scripts/importDefinitelyTypedTests/importDefinitelyTypedTests.js
5555
scripts/generateLocalizedDiagnosticMessages.js
56+
scripts/request-pr-review.js
5657
scripts/*.js.map
5758
scripts/typings/
5859
coverage/

Gulpfile.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ const copyright = "CopyrightNotice.txt";
2222
const cleanTasks = [];
2323

2424
const buildScripts = () => buildProject("scripts");
25+
task("scripts", buildScripts);
26+
task("scripts").description = "Builds files in the 'scripts' folder.";
27+
2528
const cleanScripts = () => cleanProject("scripts");
2629
cleanTasks.push(cleanScripts);
2730

scripts/request-pr-review.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/// <reference lib="esnext.asynciterable" />
2+
/// <reference lib="es2015.promise" />
3+
import octokit = require("@octokit/rest");
4+
import Octokit = octokit.Octokit;
5+
import minimist = require("minimist");
6+
7+
const options = minimist(process.argv.slice(2), {
8+
boolean: ["help"],
9+
string: ["token", "pull", "reviewer", "owner", "repo"],
10+
alias: {
11+
pr: "pull",
12+
h: "help",
13+
["?"]: "help"
14+
},
15+
default: {
16+
token: process.env.GH_TOKEN,
17+
pull: process.env.GH_PULL_NUMBER,
18+
reviewer: process.env.REQUESTED_REVIEWER,
19+
owner: "microsoft",
20+
repo: "TypeScript"
21+
}
22+
});
23+
24+
if (options.help) {
25+
printHelpAndExit(0);
26+
}
27+
28+
if (!options.token || !options.pull || !options.reviewer || !options.owner || !options.repo) {
29+
console.error("Invalid arguments");
30+
printHelpAndExit(-1);
31+
}
32+
33+
const pull_number = +options.pull;
34+
if (!isFinite(pull_number)) {
35+
console.error("Invalid arguments");
36+
printHelpAndExit(-2);
37+
}
38+
39+
const reviewers = Array.isArray(options.reviewer) ? options.reviewer : [options.reviewer];
40+
41+
main().catch(console.error);
42+
43+
async function main() {
44+
const gh = new Octokit({ auth: options.token });
45+
const response = await gh.pulls.createReviewRequest({
46+
owner: options.owner,
47+
repo: options.repo,
48+
pull_number,
49+
reviewers,
50+
});
51+
if (response.status === 201) {
52+
console.log(`Added ${reviewers.join(", ")} to ${response.data.url}`);
53+
}
54+
else {
55+
console.log(`Failed to add ${reviewers.join(", ")} to the pull request.`);
56+
}
57+
}
58+
59+
function printHelpAndExit(exitCode: number) {
60+
console.log(`
61+
usage: request-pr-review.js [options]
62+
63+
options:
64+
--token <token> Your GitHub auth token. Uses %GH_TOKEN% if present.
65+
--owner <owner> The GH user or organization for the repo (default: 'microsoft').
66+
--repo <repo> The GH repo for the pull request (default: 'TypeScript').
67+
--pull <pr_number> The pull request number. Uses %GH_PULL_NUMBER% if present.
68+
--reviewer <reviewer> The GH username of reviewer to add. May be specified multiple times.
69+
Uses %REQUESTED_REVIEWER% if present.
70+
-h --help Prints this help message.
71+
`);
72+
return process.exit(exitCode);
73+
}

scripts/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"configurePrerelease.ts",
1818
"buildProtocol.ts",
1919
"produceLKG.ts",
20-
"word2md.ts"
20+
"word2md.ts",
21+
"request-pr-review.ts"
2122
]
2223
}

src/compiler/checker.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3095,8 +3095,8 @@ namespace ts {
30953095
function resolveExternalModuleSymbol(moduleSymbol: Symbol, dontResolveAlias?: boolean): Symbol;
30963096
function resolveExternalModuleSymbol(moduleSymbol: Symbol | undefined, dontResolveAlias?: boolean): Symbol | undefined;
30973097
function resolveExternalModuleSymbol(moduleSymbol: Symbol, dontResolveAlias?: boolean): Symbol {
3098-
if (moduleSymbol) {
3099-
const exportEquals = resolveSymbol(moduleSymbol.exports!.get(InternalSymbolName.ExportEquals), dontResolveAlias);
3098+
if (moduleSymbol?.exports) {
3099+
const exportEquals = resolveSymbol(moduleSymbol.exports.get(InternalSymbolName.ExportEquals), dontResolveAlias);
31003100
const exported = getCommonJsExportEquals(getMergedSymbol(exportEquals), getMergedSymbol(moduleSymbol));
31013101
return getMergedSymbol(exported) || moduleSymbol;
31023102
}
@@ -4066,9 +4066,10 @@ namespace ts {
40664066
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop, moduleResolverHost: flags! & NodeBuilderFlags.DoNotIncludeSymbolChain ? {
40674067
getCommonSourceDirectory: (host as Program).getCommonSourceDirectory ? () => (host as Program).getCommonSourceDirectory() : () => "",
40684068
getSourceFiles: () => host.getSourceFiles(),
4069-
getCurrentDirectory: maybeBind(host, host.getCurrentDirectory),
4069+
getCurrentDirectory: () => host.getCurrentDirectory(),
40704070
getProbableSymlinks: maybeBind(host, host.getProbableSymlinks),
4071-
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames)
4071+
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
4072+
redirectTargetsMap: host.redirectTargetsMap,
40724073
} : undefined },
40734074
encounteredError: false,
40744075
visitedTypes: undefined,
@@ -5028,9 +5029,7 @@ namespace ts {
50285029
specifierCompilerOptions,
50295030
contextFile,
50305031
moduleResolverHost,
5031-
host.getSourceFiles(),
50325032
{ importModuleSpecifierPreference: isBundle ? "non-relative" : "relative" },
5033-
host.redirectTargetsMap,
50345033
));
50355034
links.specifierCache = links.specifierCache || createMap();
50365035
links.specifierCache.set(contextFile.path, specifier);
@@ -6450,7 +6449,7 @@ namespace ts {
64506449
const getCanonicalFileName = createGetCanonicalFileName(!!host.useCaseSensitiveFileNames);
64516450
const resolverHost = {
64526451
getCanonicalFileName,
6453-
getCurrentDirectory: context.tracker.moduleResolverHost.getCurrentDirectory ? () => context.tracker.moduleResolverHost!.getCurrentDirectory!() : () => "",
6452+
getCurrentDirectory: () => context.tracker.moduleResolverHost!.getCurrentDirectory(),
64546453
getCommonSourceDirectory: () => context.tracker.moduleResolverHost!.getCommonSourceDirectory()
64556454
};
64566455
const newName = getResolvedExternalModuleName(resolverHost, targetFile);
@@ -22684,8 +22683,8 @@ namespace ts {
2268422683
// Grammar checking
2268522684
checkGrammarObjectLiteralExpression(node, inDestructuringPattern);
2268622685

22687-
let propertiesTable: SymbolTable;
22688-
const allPropertiesTable = createSymbolTable();
22686+
const allPropertiesTable = strictNullChecks ? createSymbolTable() : undefined;
22687+
let propertiesTable = createSymbolTable();
2268922688
let propertiesArray: Symbol[] = [];
2269022689
let spread: Type = emptyObjectType;
2269122690

@@ -22701,7 +22700,6 @@ namespace ts {
2270122700
let patternWithComputedProperties = false;
2270222701
let hasComputedStringProperty = false;
2270322702
let hasComputedNumberProperty = false;
22704-
propertiesTable = createSymbolTable();
2270522703

2270622704
let offset = 0;
2270722705
for (let i = 0; i < node.properties.length; i++) {
@@ -22767,7 +22765,7 @@ namespace ts {
2276722765
prop.type = type;
2276822766
prop.target = member;
2276922767
member = prop;
22770-
allPropertiesTable.set(prop.escapedName, prop);
22768+
allPropertiesTable?.set(prop.escapedName, prop);
2277122769
}
2277222770
else if (memberDecl.kind === SyntaxKind.SpreadAssignment) {
2277322771
if (languageVersion < ScriptTarget.ES2015) {
@@ -22785,16 +22783,9 @@ namespace ts {
2278522783
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
2278622784
return errorType;
2278722785
}
22788-
for (const right of getPropertiesOfType(type)) {
22789-
const rightType = getTypeOfSymbol(right);
22790-
const left = allPropertiesTable.get(right.escapedName);
22791-
if (strictNullChecks &&
22792-
left &&
22793-
!maybeTypeOfKind(rightType, TypeFlags.Nullable)) {
22794-
error(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName));
22795-
}
22786+
if (allPropertiesTable) {
22787+
checkSpreadPropOverrides(type, allPropertiesTable, memberDecl);
2279622788
}
22797-
2279822789
spread = getSpreadType(spread, type, node.symbol, objectFlags, inConstContext);
2279922790
offset = i + 1;
2280022791
continue;
@@ -22965,6 +22956,7 @@ namespace ts {
2296522956
*/
2296622957
function createJsxAttributesTypeFromAttributesProperty(openingLikeElement: JsxOpeningLikeElement, checkMode: CheckMode | undefined) {
2296722958
const attributes = openingLikeElement.attributes;
22959+
const allAttributesTable = strictNullChecks ? createSymbolTable() : undefined;
2296822960
let attributesTable = createSymbolTable();
2296922961
let spread: Type = emptyJsxObjectType;
2297022962
let hasSpreadAnyType = false;
@@ -22988,6 +22980,7 @@ namespace ts {
2298822980
attributeSymbol.type = exprType;
2298922981
attributeSymbol.target = member;
2299022982
attributesTable.set(attributeSymbol.escapedName, attributeSymbol);
22983+
allAttributesTable?.set(attributeSymbol.escapedName, attributeSymbol);
2299122984
if (attributeDecl.name.escapedText === jsxChildrenPropertyName) {
2299222985
explicitlySpecifyChildrenAttribute = true;
2299322986
}
@@ -23004,6 +22997,9 @@ namespace ts {
2300422997
}
2300522998
if (isValidSpreadType(exprType)) {
2300622999
spread = getSpreadType(spread, exprType, attributes.symbol, objectFlags, /*readonly*/ false);
23000+
if (allAttributesTable) {
23001+
checkSpreadPropOverrides(exprType, allAttributesTable, attributeDecl);
23002+
}
2300723003
}
2300823004
else {
2300923005
typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
@@ -23088,6 +23084,16 @@ namespace ts {
2308823084
return childrenTypes;
2308923085
}
2309023086

23087+
function checkSpreadPropOverrides(type: Type, props: SymbolTable, spread: SpreadAssignment | JsxSpreadAttribute) {
23088+
for (const right of getPropertiesOfType(type)) {
23089+
const left = props.get(right.escapedName);
23090+
if (left && !maybeTypeOfKind(getTypeOfSymbol(right), TypeFlags.Nullable)) {
23091+
const diagnostic = error(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName));
23092+
addRelatedInfo(diagnostic, createDiagnosticForNode(spread, Diagnostics.This_spread_always_overwrites_this_property));
23093+
}
23094+
}
23095+
}
23096+
2309123097
/**
2309223098
* Check attributes property of opening-like element. This function is called during chooseOverload to get call signature of a JSX opening-like element.
2309323099
* (See "checkApplicableSignatureForJsxOpeningLikeElement" for how the function is used)

0 commit comments

Comments
 (0)