diff --git a/server/src/sas/FormatOnTypeProvider.ts b/server/src/sas/FormatOnTypeProvider.ts index ebf7e0821..c380bc811 100644 --- a/server/src/sas/FormatOnTypeProvider.ts +++ b/server/src/sas/FormatOnTypeProvider.ts @@ -351,6 +351,25 @@ export class FormatOnTypeProvider { curToken.style === Lexer.TOKEN_TYPES.MKEYWORD || curToken.style === Lexer.TOKEN_TYPES.MSKEYWORD ) { + if ( + curToken.style === Lexer.TOKEN_TYPES.KEYWORD && + /^(submit|interactive|i)$/i.test(curTokenText) + ) { + const block = this.syntaxProvider.getFoldingBlock( + curLine, + curIndex, + true, + true, + true, + ); + if ( + block && + block.type === LexerEx.SEC_TYPE.PROC && + this.syntaxProvider.getSymbolName(block) === "PROC PYTHON" + ) { + return -curIndent; + } + } if ( curTokenText.toUpperCase() === "DATA" || curTokenText.toUpperCase() === "PROC" || diff --git a/server/src/sas/LanguageServiceProvider.ts b/server/src/sas/LanguageServiceProvider.ts index f4565e695..ad4c72530 100644 --- a/server/src/sas/LanguageServiceProvider.ts +++ b/server/src/sas/LanguageServiceProvider.ts @@ -170,7 +170,7 @@ export class LanguageServiceProvider { end: { line: block.endFoldingLine, character: block.endFoldingCol }, }; const docSymbol: DocumentSymbol = { - name: this._getSymbolName(block), + name: this.syntaxProvider.getSymbolName(block), kind: SymbolKinds[block.type], range, selectionRange: range, @@ -246,32 +246,4 @@ export class LanguageServiceProvider { setLibService(fn: LibService): void { return this.syntaxProvider.lexer.syntaxDb.setLibService(fn); } - - private _getSymbolName(block: FoldingBlock) { - const line = block.startLine; - const tokens = this.syntaxProvider.getSyntax(line); - for (let i = 2; i < tokens.length; i++) { - const token = tokens[i]; - if (token.start <= block.startCol) { - continue; - } - if (token.style === "proc-name" || token.style === "text") { - const end = - i === tokens.length - 1 - ? this.model.getColumnCount(line) - : tokens[i + 1].start; - const tokenText = this.model.getText({ - start: { line, column: token.start }, - end: { line, column: end }, - }); - if (tokenText.trim() === "") { - continue; - } - return `${block.name} ${ - token.style === "proc-name" ? tokenText.toUpperCase() : tokenText - }`; - } - } - return block.name; - } } diff --git a/server/src/sas/SyntaxProvider.ts b/server/src/sas/SyntaxProvider.ts index f4d411878..58908539b 100644 --- a/server/src/sas/SyntaxProvider.ts +++ b/server/src/sas/SyntaxProvider.ts @@ -397,4 +397,31 @@ export class SyntaxProvider { setTokenCallback(cb: ((token: Token) => void) | undefined): void { this._tokenCallback = cb; } + getSymbolName(block: FoldingBlock) { + const line = block.startLine; + const tokens = this.getSyntax(line); + for (let i = 2; i < tokens.length; i++) { + const token = tokens[i]; + if (token.start <= block.startCol) { + continue; + } + if (token.style === "proc-name" || token.style === "text") { + const end = + i === tokens.length - 1 + ? this.model.getColumnCount(line) + : tokens[i + 1].start; + const tokenText = this.model.getText({ + start: { line, column: token.start }, + end: { line, column: end }, + }); + if (tokenText.trim() === "") { + continue; + } + return `${block.name} ${ + token.style === "proc-name" ? tokenText.toUpperCase() : tokenText + }`; + } + } + return block.name; + } }