1c-syntax / bsl-language-server

Реализация Language Server Protocol для языка 1C (BSL)
https://1c-syntax.github.io/bsl-language-server
Other
302 stars 105 forks source link

[BUG] Can't rebuild content from uri (java.nio.file.NoSuchFileException) при наличии символов [ ] в пути #3157

Open vmarkovsky opened 11 months ago

vmarkovsky commented 11 months ago

Версия v0.22.0

Описание ошибки диагностики Если в пути или имени файла есть символ [ или ] (квадратная скобка, квадратные скобки, square brackets), возникает ошибка Can't rebuild content from uri (java.nio.file.NoSuchFileException)

Пример кода От кода не зависит, зависит только от имен папок/файлов.

Скриншоты

Дополнительная информация путь к файлу: .\erf\report - [register details]\Ext\ObjectModule.bsl

java -jar bsl-language-server-0.22.0-exec.jar --analyze --srcDir ./erf --reporter json 2023-10-06T02:49:50.212+03:00 ERROR 13352 --- [onPool-worker-1] c.g._.b.l.context.DocumentContext : Can't rebuild content from uri

java.nio.file.NoSuchFileException: .\erf\report - ?register details?\Ext\ObjectModule.bsl at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108) at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:236) at java.base/java.nio.file.Files.newByteChannel(Files.java:380) at java.base/java.nio.file.Files.newByteChannel(Files.java:432) at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:422) at java.base/java.nio.file.Files.newInputStream(Files.java:160) at org.apache.commons.io.FileUtils.lambda$readFileToString$12(FileUtils.java:2616) at org.apache.commons.io.IOUtils.toString(IOUtils.java:3177) at org.apache.commons.io.IOUtils.toString(IOUtils.java:3152) at org.apache.commons.io.FileUtils.readFileToString(FileUtils.java:2616) at com.github._1c_syntax.bsl.languageserver.context.DocumentContext.rebuild(DocumentContext.java:304) at com.github._1c_syntax.bsl.languageserver.context.ServerContext.rebuildDocument(ServerContext.java:220) at com.github._1c_syntax.bsl.languageserver.context.ServerContext.lambda$populateContext$0(ServerContext.java:117) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290) at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

nixel2007 commented 11 months ago

Добрый день. Кажется проблему с квадратными скобками уже регали. Ждёт своего решения в 1c-syntax/utils :(

vmarkovsky commented 11 months ago

Возможно, стоит заменить устаревший класс File в DocumentContext.java

  protected void rebuild() {
    try {
      var newContent = FileUtils.readFileToString(new File(uri), StandardCharsets.UTF_8);
      rebuild(newContent, 0);
    } catch (IOException e) {
      LOGGER.error("Can't rebuild content from uri", e);
    }
  }

на обновленный Path (NIO2)

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;

  protected void rebuild() {
    try {
      Path filePath = Paths.get(uri);
      var newContent = FileUtils.readFileToString(filePath, StandardCharsets.UTF_8);
      rebuild(newContent, 0);
    } catch (IOException e) {
      LOGGER.error("Can't rebuild content from uri", e);
    }
  }
nixel2007 commented 11 months ago

Там дело не в File, а в том как преобразуется входящий URI

vmarkovsky commented 11 months ago

Добрый день. Кажется проблему с квадратными скобками уже регали. Ждёт своего решения в 1c-syntax/utils :(

не нашел...

Там дело не в File, а в том как преобразуется входящий URI

Как я понимаю, метод Paths.get() работает с учетом экранирования символов [ и ].

nixel2007 commented 11 months ago

Да, только ему уже приходит uri, который невалидно обработал []

asosnoviy commented 9 months ago

Да, только ему уже приходит uri, который невалидно обработал []

Обработка [] похоже есть в утилсах и этот пример не падает из vsc. Падает из аналайз.