gpt4 book ai didi

java - 在 Java 包上使用 "ls"命令时出现不支持的方案错误

转载 作者:行者123 更新时间:2023-11-30 05:55:00 25 4
gpt4 key购买 nike

我正在开发一个函数,该函数给出 Java M3 中每个包的代码量列表。这个函数看起来像这样:

public list[int] calculateSizePerComponent(M3 model){
set[loc] packages = packages(model);
list[int] componentSizes = [];
for(package <- packages){
list[loc] classFiles = [x | x <- package.ls, endsWith(x.file, ".java")];
if(size(classFiles)>0){
int sourceSize = 0;
for(classFile <- classFiles){
sourceSize+=getLinesOfCode(classFile).linesOfCode;
}
componentSizes += sourceSize;
}
}
return componentSizes;
}

我使用以下函数来计算 Java 编译单元中的代码行数(体积)(适用于其他示例):

public tuple[int linesOfCode,int blankLines,int commentLines] getLinesOfCode(loc location) {
int linesOfCode = 0;
int blankLines = 0;
int commentLines = 0;
bool incomment = false;

srcLines = readFileLines(location);
for (line <- srcLines) {
switch(line){
case /^\s*\/\/\s*\w*/: commentLines += 1; // Line preceded by '//'
case /((\s*\/\*[\w\s]+\*\/)+[\s\w]+(\/\/[\s\w]+$)*)+/: linesOfCode += 1; // Line containing Java code containing any amount of comments. Example: code /**comment*/ code /**comment*/ code
case /^\s*\/\*?[\w\s\?\@]*\*\/$/: commentLines += 1; // Line containing single line comment: /*comment*/
case /\s*\/\*[\w\s]*\*\/[\s\w]+/: linesOfCode += 1; // Line containing a comment, but also code. Example: /**comment*/ code
case /^[\s\w]*\*\/\s*\w+[\s\w]*/: {incomment = false; linesOfCode += 1;} // Line closing a multi-line comment, but also containing code. Example: comment*/ code
case /^\s*\/\*\*?[^\*\/]*$/: {incomment = true; commentLines += 1;} // Line opening a multi-line comment, Example: /**comment
case /\s*\*\/\s*$/: {commentLines += 1; incomment = false;} // Line closing a multi-line comment, Example: comment*/
case /^\s*$/: blankLines += 1; // Blank line
default: if (incomment) commentLines += 1; else linesOfCode += 1;
}
}
return <linesOfCode,blankLines,commentLines>;
}

但是,package.ls 似乎返回的结果具有错误的方案。因此,我在 readFileLines 调用中收到以下错误:

|std:///IO.rsc|(14565,775,<583,0>,<603,43>): IO("Unsupported scheme java+package")
at *** somewhere ***(|std:///IO.rsc|(14565,775,<583,0>,<603,43>))
at readFileLines(|project://Software_Evolution/src/metrics/volume.rsc|(1911,8,<49,26>,<49,34>))
at calculateSizePerComponent(|project://Software_Evolution/src/metrics/componentsize.rsc|(1996,38,<64,16>,<64,54>))
at getComponentSize(|project://Software_Evolution/src/metrics/componentsize.rsc|(267,1112,<15,0>,<42,1>))
at $root$(|prompt:///|(0,30,<1,0>,<1,30>))

当我打印位置时,我得到以下信息:

|java+package:///smallsql/database/language/Language.java|

这是不正确的,因为这是一个 java 编译单元而不是一个包。如何获取此文件中的代码行?

最佳答案

逐步分析:

  • package.ls 之所以有效,是因为首先逻辑 URI 由注册表“名称服务器”解析为磁盘上的实际物理文件夹。如果这确实是一个目录,那么 .ls 具有正确的语义,您将获得该文件夹中的文件列表。
  • loc |java+package:///smallsql/database/language/Language.java| 实际上指向一个文件,甚至不是一个compilationUnit。
  • 在构建子位置时发生了一些意想不到的事情,它采用了文件夹的旧逻辑位置,并简单地连接了子文件“Language.java”的名称,但这没有意义。
  • 我在当前的主版本中修复了这个错误,几分钟后就会发布不稳定的版本
  • 但您也可以通过首先将包位置解析为物理位置来解决此问题:resolve(package).ls 应该会做得更好。

PS:正则表达式很容易出错,并且您可能需要处理很多极端情况。我会使用从 Java 语法定义生成的真实解析器,或者使用 M3 通过 Eclipse 编译器生成的语法树来计算 SLOC。

关于java - 在 Java 包上使用 "ls"命令时出现不支持的方案错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com