From bccdab3cf7a77458e8fcef919d534d8428eca24d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahsan=20P=C3=A9rez?= Date: Sun, 22 Feb 2026 06:57:47 -0500 Subject: [PATCH] Fix various bugs and allow api keyword --- .../pyright-internal/src/analyzer/typePrinter.ts | 3 +++ packages/pyright-internal/src/analyzer/types.ts | 2 ++ .../pyright-internal/src/common/configOptions.ts | 15 +++++++++++++++ .../src/languageService/completionProvider.ts | 1 + .../pyright-internal/src/parser/parseNodes.ts | 4 ++++ packages/pyright-internal/src/parser/tokenizer.ts | 1 + .../pyright-internal/src/parser/tokenizerTypes.ts | 3 +++ packages/pyright-internal/src/server.ts | 7 +++++++ 8 files changed, 36 insertions(+) diff --git a/packages/pyright-internal/src/analyzer/typePrinter.ts b/packages/pyright-internal/src/analyzer/typePrinter.ts index 08ff0fb78..a98a23bb8 100644 --- a/packages/pyright-internal/src/analyzer/typePrinter.ts +++ b/packages/pyright-internal/src/analyzer/typePrinter.ts @@ -1118,6 +1118,9 @@ function printTypeWithCythonDetails(type: Type, objName: string) { if (details.isPublic) { prefixes.push('public'); } + if (details.isApi) { + prefixes.push('api'); + } if (details.isConst) { prefixes.push('const'); } diff --git a/packages/pyright-internal/src/analyzer/types.ts b/packages/pyright-internal/src/analyzer/types.ts index 938d228a7..079d5548b 100644 --- a/packages/pyright-internal/src/analyzer/types.ts +++ b/packages/pyright-internal/src/analyzer/types.ts @@ -299,6 +299,7 @@ export namespace TypeBase { isConst: node ? CTypeNode.isConstant(node) : false, isVolatile: node ? CTypeNode.isVolatile(node) : false, isPublic: node ? CTypeNode.isPublic(node) : false, + isApi: node ? CTypeNode.isApi(node) : false, isReadOnly: node ? CTypeNode.isReadOnly(node) : false, numMods: node ? CTypeNode.numModifiers(node) : [], trailType: node ? CTypeNode.trailType(node) : CTrailType.None, @@ -606,6 +607,7 @@ export interface CythonDetails { isVolatile?: boolean; isReadOnly?: boolean; isPublic?: boolean; + isApi?: boolean; numMods?: string[]; // Numeric modifiers trailType?: CTrailType; diff --git a/packages/pyright-internal/src/common/configOptions.ts b/packages/pyright-internal/src/common/configOptions.ts index 090981e21..2ce10bd2f 100644 --- a/packages/pyright-internal/src/common/configOptions.ts +++ b/packages/pyright-internal/src/common/configOptions.ts @@ -500,6 +500,17 @@ export function getOffDiagnosticRuleSet(): DiagnosticRuleSet { return diagSettings; } +/** Cython: minimal diagnostics — only syntax/parse errors. Suppresses import and undefined-variable noise for .pyx/.pxd. */ +export function getCythonDiagnosticRuleSet(): DiagnosticRuleSet { + const diagSettings: DiagnosticRuleSet = { + ...getOffDiagnosticRuleSet(), + reportMissingImports: 'none', + reportMissingModuleSource: 'none', + reportUndefinedVariable: 'none', + }; + return diagSettings; +} + export function getBasicDiagnosticRuleSet(): DiagnosticRuleSet { const diagSettings: DiagnosticRuleSet = { printUnknownAsAny: false, @@ -818,6 +829,10 @@ export class ConfigOptions { return getOffDiagnosticRuleSet(); } + if (typeCheckingMode === 'cython') { + return getCythonDiagnosticRuleSet(); + } + return getBasicDiagnosticRuleSet(); } diff --git a/packages/pyright-internal/src/languageService/completionProvider.ts b/packages/pyright-internal/src/languageService/completionProvider.ts index 7d1e631e8..c0dee2d1d 100644 --- a/packages/pyright-internal/src/languageService/completionProvider.ts +++ b/packages/pyright-internal/src/languageService/completionProvider.ts @@ -174,6 +174,7 @@ namespace Keywords { 'const', 'readonly', 'public', + 'api', 'signed', 'unsigned', 'long', diff --git a/packages/pyright-internal/src/parser/parseNodes.ts b/packages/pyright-internal/src/parser/parseNodes.ts index 89f650c5c..b3baf57b3 100644 --- a/packages/pyright-internal/src/parser/parseNodes.ts +++ b/packages/pyright-internal/src/parser/parseNodes.ts @@ -2572,6 +2572,10 @@ export namespace CTypeNode { return hasModifier(node, KeywordType.Public); } + export function isApi(node: CTypeNode) { + return hasModifier(node, KeywordType.Api); + } + export function isReadOnly(node: CTypeNode) { return hasModifier(node, KeywordType.Readonly); } diff --git a/packages/pyright-internal/src/parser/tokenizer.ts b/packages/pyright-internal/src/parser/tokenizer.ts index 33a86d2b0..b2bcdb75a 100644 --- a/packages/pyright-internal/src/parser/tokenizer.ts +++ b/packages/pyright-internal/src/parser/tokenizer.ts @@ -102,6 +102,7 @@ const _keywords: Map = new Map([ ['const', KeywordType.Const], ['readonly', KeywordType.Readonly], ['public', KeywordType.Public], + ['api', KeywordType.Api], ['signed', KeywordType.Signed], ['unsigned', KeywordType.Unsigned], ['long', KeywordType.Long], diff --git a/packages/pyright-internal/src/parser/tokenizerTypes.ts b/packages/pyright-internal/src/parser/tokenizerTypes.ts index 5e0543d57..7de03c133 100644 --- a/packages/pyright-internal/src/parser/tokenizerTypes.ts +++ b/packages/pyright-internal/src/parser/tokenizerTypes.ts @@ -167,6 +167,7 @@ export const enum KeywordType { Const, Readonly, Public, + Api, Signed, Unsigned, Long, @@ -196,6 +197,7 @@ export const varModifiers = [ KeywordType.Readonly, KeywordType.Inline, KeywordType.Public, + KeywordType.Api, KeywordType.Volatile, ]; @@ -218,6 +220,7 @@ export const softKeywords = [ KeywordType.Const, KeywordType.Readonly, KeywordType.Public, + KeywordType.Api, KeywordType.Signed, KeywordType.Unsigned, KeywordType.Long, diff --git a/packages/pyright-internal/src/server.ts b/packages/pyright-internal/src/server.ts index 11d21272b..b3dc436d9 100644 --- a/packages/pyright-internal/src/server.ts +++ b/packages/pyright-internal/src/server.ts @@ -226,7 +226,14 @@ export class PyrightServer extends LanguageServerBase { }); serverSettings.includePaths = cythonPaths; } + if (cythonSection.typeCheckingMode !== undefined && isString(cythonSection.typeCheckingMode)) { + serverSettings.typeCheckingMode = cythonSection.typeCheckingMode; + } } + + // ! Cython: use minimal diagnostics for .pyx/.pxd to avoid false positives + // (missing imports, undefined vars from cimports/C types). Set cython.typeCheckingMode to override. + serverSettings.typeCheckingMode = serverSettings.typeCheckingMode ?? 'cython'; } catch (error) { this.console.error(`Error reading settings: ${error}`); }