Visual studio code 为什么我有错误,重叠范围是不允许的?

Visual studio code 为什么我有错误,重叠范围是不允许的?,visual-studio-code,vscode-extensions,Visual Studio Code,Vscode Extensions,我正在构建格式化程序扩展。不幸的是,我找不到很多处理简单任务的例子 这是我的文件格式化程序提供程序,我尝试大写一些关键字。这在扩展刷新后第一次工作,但不是第二次 我做错了什么 “严格使用”; 从“vscode”导入*作为vscode; 导出类STFormatterProvider实现vscode.DocumentFormattingEditProvider{ 公共输出:数组=[]; 提供的文档格式编辑(文档:vscode.TextDocument){ 本文件应大写(文件); 把这个退出来; }

我正在构建格式化程序扩展。不幸的是,我找不到很多处理简单任务的例子

这是我的文件格式化程序提供程序,我尝试大写一些关键字。这在扩展刷新后第一次工作,但不是第二次

我做错了什么

“严格使用”;
从“vscode”导入*作为vscode;
导出类STFormatterProvider实现vscode.DocumentFormattingEditProvider{
公共输出:数组=[];
提供的文档格式编辑(文档:vscode.TextDocument){
本文件应大写(文件);
把这个退出来;
}
大写(文档:vscode.TextDocument){
let关键字=['true','false','exit','continue','return','constant','retain'];
for(让line=0;line0){
让str=element.text.replace(regEx,(match,content)=>{
返回match.toUpperCase();
});
这个,出去,推(
vscode.TextEdit.replace(element.range,str)
);
}
}
}
}

产生此
重叠范围的主要原因是没有重置
out
数组

我还执行了其他一些重构

class STFormatterProvider implements vscode.DocumentFormattingEditProvider {

  public out: Array<vscode.TextEdit> = [];

  provideDocumentFormattingEdits(document: vscode.TextDocument) {
      this.out = [];
      this.capitalize(document);
      return this.out;
  }

  capitalize(document: vscode.TextDocument) {
      let keywords = ['true', 'false', 'exit', 'continue', 'return', 'constant', 'retain'];

      let regEx = new RegExp(`\\b(${keywords.join('|')})\\b`, "ig");
      for (let lineNr = 0; lineNr < document.lineCount; ++lineNr) {
          const line = document.lineAt(lineNr);
          if (regEx.test(line.text)) {
              let str = line.text.replace(regEx, (match) => { return match.toUpperCase(); });
              this.out.push( vscode.TextEdit.replace(line.range, str) );
          }
      }
  }
}
类STFormatterProvider实现vscode.DocumentFormattingEditProvider{
公共输出:数组=[];
提供的文档格式编辑(文档:vscode.TextDocument){
this.out=[];
本文件应大写(文件);
把这个退出来;
}
大写(文档:vscode.TextDocument){
let关键字=['true','false','exit','continue','return','constant','retain'];
让regEx=newregexp(`\\b(${keywords.join('|')})\\b`,“ig”);
对于(让lineNr=0;lineNr{return match.toUpperCase();});
this.out.push(vscode.TextEdit.replace(line.range,str));
}
}
}
}

我认为您应该使用
TextEditor::edit()
。首先收集文档上所有可能的替换项,然后调用
TextEditor::edit()
,并将所有编辑应用于
editBuilder
。这样可能会出现范围重叠的情况。为什么要为每一行创建一个新的正则表达式。在使用
replace
调用时,如果需要,只需重置
lastIndex
。我遵循这个示例,我没有
editBuilder
textEditor
。第二,如何使用
replace
重置
lastIndex
?如何处理字符串文本和注释中的关键字?我没有。我该怎么做?我也很模糊地看到如何缩进。您有什么建议?您需要为您的语言添加一个解析器,并使用解析树来指导格式化