diff --git a/codemetrica/language/python/PyCodeBlock.ts b/codemetrica/language/python/PyCodeBlock.ts deleted file mode 100644 index 7287e97..0000000 --- a/codemetrica/language/python/PyCodeBlock.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { AtomContext, Simple_stmtContext, Except_blockContext, Except_star_blockContext, ExpressionContext, Match_stmtContext, Star_expressionContext } from "../../../grammars-v4/python/python3_12/PythonParser"; -import PythonParserVisitor from "../../../grammars-v4/python/python3_12/PythonParserVisitor"; -import { ParserRuleContext } from 'antlr4'; -import { LanguageEnum } from "../../LanguageEnum"; -import { ICodeBlock } from "../../interface/ICodeBlock"; - -export abstract class PyCodeBlock implements ICodeBlock{ - ctx: T - language: LanguageEnum - - constructor(ctx: T) { - this.ctx = ctx; - this.language = LanguageEnum.PYTHON; - } - - getClasses() { - throw new Error("Method getClasses() must be implemented"); - } - - getFunctions() { - throw new Error("Method getFunctions() must be implemented"); - } - - getMethods() { - throw new Error("Method getMethods() must be implemented"); - } - - getSimpleStatements(): Simple_stmtContext[] { - const visitor = new (class extends PythonParserVisitor { - simpleStatements: Simple_stmtContext[] = []; - visitSimple_stmt = (ctx: Simple_stmtContext): void => { - this.simpleStatements.push(ctx); - }; - })(); - - visitor.visit(this.ctx); - return visitor.simpleStatements - } - - getExpressions(): ExpressionContext[] { - const visitor = new (class extends PythonParserVisitor { - expressions: ExpressionContext[] = []; - visitExpression = (ctx: ExpressionContext): void => { - this.expressions.push(ctx); - }; - })(); - - visitor.visit(this.ctx); - return visitor.expressions; - } - - getMatches() { - const visitor = new (class extends PythonParserVisitor { - matches: Match_stmtContext[] = []; - visitMatch_stmt = (ctx: Match_stmtContext): void => { - this.matches.push(ctx); - }; - })(); - - visitor.visit(this.ctx); - return visitor.matches; - } - - getNumberLiterals() { - const visitor = new (class extends PythonParserVisitor { - numberLiterals: Star_expressionContext[] = []; - visitStar_expression = (ctx: Star_expressionContext): void => { - if (this.anyTerminalsAreNumber(ctx)) { - this.numberLiterals.push(ctx); - } - }; - - anyTerminalsAreNumber = (ctx: any): boolean => { - if (ctx instanceof AtomContext && ctx.NUMBER()) { - return true; - } - for (let i = 0; i < ctx.getChildCount(); i++) { - if (this.anyTerminalsAreNumber(ctx.getChild(i))) { - return true; - } - } - return false; - }; - })(); - - visitor.visit(this.ctx); - return visitor.numberLiterals; - } - - getExcepts() { - const visitor = new (class extends PythonParserVisitor { - excepts: (Except_blockContext | Except_star_blockContext)[] = []; - visitExcept_block = (ctx: Except_blockContext): void => { - this.excepts.push(ctx); - }; - - visitExcept_star_block = (ctx: Except_star_blockContext): void => { - this.excepts.push(ctx); - }; - })(); - - visitor.visit(this.ctx); - return visitor.excepts; - } -} diff --git a/codemetrica/DetectLanguage.ts b/src/DetectLanguage.ts similarity index 100% rename from codemetrica/DetectLanguage.ts rename to src/DetectLanguage.ts diff --git a/codemetrica/LanguageEnum.ts b/src/LanguageEnum.ts similarity index 100% rename from codemetrica/LanguageEnum.ts rename to src/LanguageEnum.ts diff --git a/codemetrica/ParseSource.ts b/src/ParseSource.ts similarity index 77% rename from codemetrica/ParseSource.ts rename to src/ParseSource.ts index 5c95433..a992e6b 100644 --- a/codemetrica/ParseSource.ts +++ b/src/ParseSource.ts @@ -1,9 +1,9 @@ -import { parsePythonSource } from './language/python/PyParser'; -import { parseJavaSource } from './language/java/parser'; +import { parsePythonSource } from './python/PyParser'; +import { parseJavaSource } from './java/parser'; import * as fs from 'fs'; -import { JavaFile } from './language/java'; -import { PyFile } from './language/python'; +import { JavaFile } from './java'; +import { PyFile } from './python'; type CodeFile = PyFile | JavaFile; diff --git a/codemetrica/thresholds.ts b/src/Thresholds.ts similarity index 70% rename from codemetrica/thresholds.ts rename to src/Thresholds.ts index b921bf1..a021941 100644 --- a/codemetrica/thresholds.ts +++ b/src/Thresholds.ts @@ -7,4 +7,8 @@ export class Thresholds { static readonly LONG_PARAMETER_LIST = 5 static readonly LONG_METHOD = 30 static readonly COMPLEX_CONDITIONAL = 3 + static readonly LONG_IDENTIFIER = 30 + + static readonly LAZY_CLASS_LOC = 10 + static readonly LARGE_CLASS_LOC = 10 } \ No newline at end of file diff --git a/grammars-v4/README.md b/src/grammars-v4/README.md similarity index 100% rename from grammars-v4/README.md rename to src/grammars-v4/README.md diff --git a/grammars-v4/java/java20/Java20Lexer.g4 b/src/grammars-v4/java/java20/Java20Lexer.g4 similarity index 100% rename from grammars-v4/java/java20/Java20Lexer.g4 rename to src/grammars-v4/java/java20/Java20Lexer.g4 diff --git a/grammars-v4/java/java20/Java20Lexer.interp b/src/grammars-v4/java/java20/Java20Lexer.interp similarity index 100% rename from grammars-v4/java/java20/Java20Lexer.interp rename to src/grammars-v4/java/java20/Java20Lexer.interp diff --git a/grammars-v4/java/java20/Java20Lexer.tokens b/src/grammars-v4/java/java20/Java20Lexer.tokens similarity index 100% rename from grammars-v4/java/java20/Java20Lexer.tokens rename to src/grammars-v4/java/java20/Java20Lexer.tokens diff --git a/grammars-v4/java/java20/Java20Lexer.ts b/src/grammars-v4/java/java20/Java20Lexer.ts similarity index 100% rename from grammars-v4/java/java20/Java20Lexer.ts rename to src/grammars-v4/java/java20/Java20Lexer.ts diff --git a/grammars-v4/java/java20/Java20Parser.g4 b/src/grammars-v4/java/java20/Java20Parser.g4 similarity index 100% rename from grammars-v4/java/java20/Java20Parser.g4 rename to src/grammars-v4/java/java20/Java20Parser.g4 diff --git a/grammars-v4/java/java20/Java20Parser.interp b/src/grammars-v4/java/java20/Java20Parser.interp similarity index 100% rename from grammars-v4/java/java20/Java20Parser.interp rename to src/grammars-v4/java/java20/Java20Parser.interp diff --git a/grammars-v4/java/java20/Java20Parser.tokens b/src/grammars-v4/java/java20/Java20Parser.tokens similarity index 100% rename from grammars-v4/java/java20/Java20Parser.tokens rename to src/grammars-v4/java/java20/Java20Parser.tokens diff --git a/grammars-v4/java/java20/Java20Parser.ts b/src/grammars-v4/java/java20/Java20Parser.ts similarity index 100% rename from grammars-v4/java/java20/Java20Parser.ts rename to src/grammars-v4/java/java20/Java20Parser.ts diff --git a/grammars-v4/java/java20/Java20ParserListener.ts b/src/grammars-v4/java/java20/Java20ParserListener.ts similarity index 100% rename from grammars-v4/java/java20/Java20ParserListener.ts rename to src/grammars-v4/java/java20/Java20ParserListener.ts diff --git a/grammars-v4/java/java20/Java20ParserVisitor.ts b/src/grammars-v4/java/java20/Java20ParserVisitor.ts similarity index 100% rename from grammars-v4/java/java20/Java20ParserVisitor.ts rename to src/grammars-v4/java/java20/Java20ParserVisitor.ts diff --git a/grammars-v4/python/python3_12/PythonLexer.g4 b/src/grammars-v4/python/python3_12/PythonLexer.g4 similarity index 100% rename from grammars-v4/python/python3_12/PythonLexer.g4 rename to src/grammars-v4/python/python3_12/PythonLexer.g4 diff --git a/grammars-v4/python/python3_12/PythonLexer.interp b/src/grammars-v4/python/python3_12/PythonLexer.interp similarity index 100% rename from grammars-v4/python/python3_12/PythonLexer.interp rename to src/grammars-v4/python/python3_12/PythonLexer.interp diff --git a/grammars-v4/python/python3_12/PythonLexer.tokens b/src/grammars-v4/python/python3_12/PythonLexer.tokens similarity index 100% rename from grammars-v4/python/python3_12/PythonLexer.tokens rename to src/grammars-v4/python/python3_12/PythonLexer.tokens diff --git a/grammars-v4/python/python3_12/PythonLexer.ts b/src/grammars-v4/python/python3_12/PythonLexer.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonLexer.ts rename to src/grammars-v4/python/python3_12/PythonLexer.ts diff --git a/grammars-v4/python/python3_12/PythonLexerBase.ts b/src/grammars-v4/python/python3_12/PythonLexerBase.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonLexerBase.ts rename to src/grammars-v4/python/python3_12/PythonLexerBase.ts diff --git a/grammars-v4/python/python3_12/PythonParser.g4 b/src/grammars-v4/python/python3_12/PythonParser.g4 similarity index 100% rename from grammars-v4/python/python3_12/PythonParser.g4 rename to src/grammars-v4/python/python3_12/PythonParser.g4 diff --git a/grammars-v4/python/python3_12/PythonParser.interp b/src/grammars-v4/python/python3_12/PythonParser.interp similarity index 100% rename from grammars-v4/python/python3_12/PythonParser.interp rename to src/grammars-v4/python/python3_12/PythonParser.interp diff --git a/grammars-v4/python/python3_12/PythonParser.tokens b/src/grammars-v4/python/python3_12/PythonParser.tokens similarity index 100% rename from grammars-v4/python/python3_12/PythonParser.tokens rename to src/grammars-v4/python/python3_12/PythonParser.tokens diff --git a/grammars-v4/python/python3_12/PythonParser.ts b/src/grammars-v4/python/python3_12/PythonParser.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonParser.ts rename to src/grammars-v4/python/python3_12/PythonParser.ts diff --git a/grammars-v4/python/python3_12/PythonParserBase.ts b/src/grammars-v4/python/python3_12/PythonParserBase.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonParserBase.ts rename to src/grammars-v4/python/python3_12/PythonParserBase.ts diff --git a/grammars-v4/python/python3_12/PythonParserListener.ts b/src/grammars-v4/python/python3_12/PythonParserListener.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonParserListener.ts rename to src/grammars-v4/python/python3_12/PythonParserListener.ts diff --git a/grammars-v4/python/python3_12/PythonParserVisitor.ts b/src/grammars-v4/python/python3_12/PythonParserVisitor.ts similarity index 100% rename from grammars-v4/python/python3_12/PythonParserVisitor.ts rename to src/grammars-v4/python/python3_12/PythonParserVisitor.ts diff --git a/codemetrica/index.ts b/src/index.ts similarity index 100% rename from codemetrica/index.ts rename to src/index.ts diff --git a/codemetrica/interface/IClass.ts b/src/interface/IClass.ts similarity index 100% rename from codemetrica/interface/IClass.ts rename to src/interface/IClass.ts diff --git a/codemetrica/interface/ICodeBlock.ts b/src/interface/ICodeBlock.ts similarity index 100% rename from codemetrica/interface/ICodeBlock.ts rename to src/interface/ICodeBlock.ts diff --git a/codemetrica/interface/IFile.ts b/src/interface/IFile.ts similarity index 100% rename from codemetrica/interface/IFile.ts rename to src/interface/IFile.ts diff --git a/codemetrica/interface/IFunction.ts b/src/interface/IFunction.ts similarity index 100% rename from codemetrica/interface/IFunction.ts rename to src/interface/IFunction.ts diff --git a/codemetrica/interface/IMethod.ts b/src/interface/IMethod.ts similarity index 100% rename from codemetrica/interface/IMethod.ts rename to src/interface/IMethod.ts diff --git a/codemetrica/interface/IParameter.ts b/src/interface/IParameter.ts similarity index 100% rename from codemetrica/interface/IParameter.ts rename to src/interface/IParameter.ts diff --git a/codemetrica/interface/metric/IMethodLength.ts b/src/interface/metric/IMethodLength.ts similarity index 100% rename from codemetrica/interface/metric/IMethodLength.ts rename to src/interface/metric/IMethodLength.ts diff --git a/codemetrica/interface/smell/ILongMethod.ts b/src/interface/smell/ILongMethod.ts similarity index 100% rename from codemetrica/interface/smell/ILongMethod.ts rename to src/interface/smell/ILongMethod.ts diff --git a/codemetrica/language/java/JavaClass.ts b/src/java/JavaClass.ts similarity index 82% rename from codemetrica/language/java/JavaClass.ts rename to src/java/JavaClass.ts index e889e77..2508120 100644 --- a/codemetrica/language/java/JavaClass.ts +++ b/src/java/JavaClass.ts @@ -1,7 +1,7 @@ import { JavaCodeBlock } from "./JavaCodeBlock"; import { JavaMethod } from "./JavaMethod"; -import { NormalClassDeclarationContext, MethodDeclarationContext } from "../../../grammars-v4/java/java20/Java20Parser"; -import JavaParserVisitor from "../../../grammars-v4/java/java20/Java20ParserVisitor"; +import { NormalClassDeclarationContext, MethodDeclarationContext } from "../grammars-v4/java/java20/Java20Parser"; +import JavaParserVisitor from "../grammars-v4/java/java20/Java20ParserVisitor"; export class JavaClass extends JavaCodeBlock { constructor(ctx: NormalClassDeclarationContext) { diff --git a/codemetrica/language/java/JavaCodeBlock.ts b/src/java/JavaCodeBlock.ts similarity index 76% rename from codemetrica/language/java/JavaCodeBlock.ts rename to src/java/JavaCodeBlock.ts index c4db7a2..c5fde72 100644 --- a/codemetrica/language/java/JavaCodeBlock.ts +++ b/src/java/JavaCodeBlock.ts @@ -1,7 +1,7 @@ import { ParserRuleContext } from 'antlr4'; -import { StatementContext } from '../../../grammars-v4/java/java20/Java20Parser'; -import JavaParserVisitor from '../../../grammars-v4/java/java20/Java20ParserVisitor'; -import { LanguageEnum } from '../../LanguageEnum'; +import { StatementContext } from '../grammars-v4/java/java20/Java20Parser'; +import JavaParserVisitor from '../grammars-v4/java/java20/Java20ParserVisitor'; +import { LanguageEnum } from '../LanguageEnum'; export abstract class JavaCodeBlock { ctx: T diff --git a/codemetrica/language/java/JavaFile.ts b/src/java/JavaFile.ts similarity index 77% rename from codemetrica/language/java/JavaFile.ts rename to src/java/JavaFile.ts index 8e49c13..025ef05 100644 --- a/codemetrica/language/java/JavaFile.ts +++ b/src/java/JavaFile.ts @@ -1,8 +1,8 @@ -import JavaParserVisitor from "../../../grammars-v4/java/java20/Java20ParserVisitor"; +import JavaParserVisitor from "../grammars-v4/java/java20/Java20ParserVisitor"; import { JavaClass } from "./JavaClass"; -import { CompilationUnitContext, NormalClassDeclarationContext } from "../../../grammars-v4/java/java20/Java20Parser"; +import { CompilationUnitContext, NormalClassDeclarationContext } from "../grammars-v4/java/java20/Java20Parser"; import { JavaCodeBlock } from "./JavaCodeBlock"; -import { IFile } from "../../interface/IFile"; +import { IFile } from "../interface/IFile"; export class JavaFile extends JavaCodeBlock implements IFile{ filePath: string | undefined; diff --git a/codemetrica/language/java/JavaMethod.ts b/src/java/JavaMethod.ts similarity index 79% rename from codemetrica/language/java/JavaMethod.ts rename to src/java/JavaMethod.ts index fb29729..3f20dca 100644 --- a/codemetrica/language/java/JavaMethod.ts +++ b/src/java/JavaMethod.ts @@ -1,7 +1,7 @@ -import { IMethod } from '../../interface/IMethod'; +import { IMethod } from '../interface/IMethod'; import { JavaCodeBlock } from "./JavaCodeBlock"; -import { MethodDeclarationContext } from "../../../grammars-v4/java/java20/Java20Parser"; +import { MethodDeclarationContext } from "../grammars-v4/java/java20/Java20Parser"; import { JavaParameter } from './JavaParameter'; export class JavaMethod extends JavaCodeBlock implements IMethod { constructor(ctx: MethodDeclarationContext) { diff --git a/codemetrica/language/java/JavaParameter.ts b/src/java/JavaParameter.ts similarity index 74% rename from codemetrica/language/java/JavaParameter.ts rename to src/java/JavaParameter.ts index 58aefcb..0f07284 100644 --- a/codemetrica/language/java/JavaParameter.ts +++ b/src/java/JavaParameter.ts @@ -1,4 +1,4 @@ -import { IParameter } from "../../interface/IParameter"; +import { IParameter } from "../interface/IParameter"; export class JavaParameter implements IParameter { name: string; diff --git a/codemetrica/language/java/index.ts b/src/java/index.ts similarity index 100% rename from codemetrica/language/java/index.ts rename to src/java/index.ts diff --git a/codemetrica/language/java/metric/MethodLength.ts b/src/java/metric/MethodLength.ts similarity index 78% rename from codemetrica/language/java/metric/MethodLength.ts rename to src/java/metric/MethodLength.ts index b0cc182..93da00e 100644 --- a/codemetrica/language/java/metric/MethodLength.ts +++ b/src/java/metric/MethodLength.ts @@ -1,4 +1,4 @@ -import { BlockStatementsContext } from '../../../../grammars-v4/java/java20/Java20Parser'; +import { BlockStatementsContext } from '../../grammars-v4/java/java20/Java20Parser'; import { JavaMethod } from '../JavaMethod'; export class MethodLength { diff --git a/codemetrica/language/java/parser.ts b/src/java/parser.ts similarity index 82% rename from codemetrica/language/java/parser.ts rename to src/java/parser.ts index c899b9f..477061f 100644 --- a/codemetrica/language/java/parser.ts +++ b/src/java/parser.ts @@ -1,6 +1,6 @@ import antlr4 from 'antlr4'; -import JavaLexer from '../../../grammars-v4/java/java20/Java20Lexer'; -import JavaParser from '../../../grammars-v4/java/java20/Java20Parser'; +import JavaLexer from '../grammars-v4/java/java20/Java20Lexer'; +import JavaParser from '../grammars-v4/java/java20/Java20Parser'; export class Parser { static getANTLRContext(fileName: string) { diff --git a/codemetrica/language/java/smell/long_method.ts b/src/java/smell/long_method.ts similarity index 71% rename from codemetrica/language/java/smell/long_method.ts rename to src/java/smell/long_method.ts index a2404b6..008d0db 100644 --- a/codemetrica/language/java/smell/long_method.ts +++ b/src/java/smell/long_method.ts @@ -1,5 +1,5 @@ -import { BlockStatementsContext } from '../../../../grammars-v4/java/java20/Java20Parser'; -import { Thresholds } from '../../../Thresholds'; +import { BlockStatementsContext } from '../../grammars-v4/java/java20/Java20Parser'; +import { Thresholds } from '../../Thresholds'; import { JavaMethod } from '../JavaMethod'; export class LongMethod { diff --git a/codemetrica/language/python/PyClass.ts b/src/python/PyClass.ts similarity index 62% rename from codemetrica/language/python/PyClass.ts rename to src/python/PyClass.ts index b1c751c..86f081e 100644 --- a/codemetrica/language/python/PyClass.ts +++ b/src/python/PyClass.ts @@ -1,8 +1,8 @@ -import { PyCodeBlock } from "./PyCodeBlock"; -import { PyFunction } from "./PyFunction"; -import { Class_defContext, Function_defContext } from "../../../grammars-v4/python/python3_12/PythonParser.js"; -import PythonParserVisitor from "../../../grammars-v4/python/python3_12/PythonParserVisitor"; -import { IClass } from "../../interface/IClass"; +import { PyCodeBlock } from "./PyCodeBlock.js"; +import { PyFunction } from "./PyFunction.js"; +import { Class_defContext, Function_defContext } from "../grammars-v4/python/python3_12/PythonParser.js"; +import PythonParserVisitor from "../grammars-v4/python/python3_12/PythonParserVisitor.js"; +import { IClass } from "../interface/IClass.js"; export class PyClass extends PyCodeBlock implements IClass { constructor(ctx: Class_defContext) { diff --git a/src/python/PyCodeBlock.ts b/src/python/PyCodeBlock.ts new file mode 100644 index 0000000..6880054 --- /dev/null +++ b/src/python/PyCodeBlock.ts @@ -0,0 +1,177 @@ +import { AtomContext, Simple_stmtContext, Except_blockContext, Except_star_blockContext, ExpressionContext, Match_stmtContext, Star_expressionContext, AssignmentContext, Function_defContext, Single_targetContext, Star_targetContext, Target_with_star_atomContext, T_primaryContext, Star_atomContext, Single_subscript_attribute_targetContext } from "../grammars-v4/python/python3_12/PythonParser"; +import PythonParserVisitor from "../grammars-v4/python/python3_12/PythonParserVisitor"; +import { ParserRuleContext, ParseTree, TerminalNode } from 'antlr4'; +import { LanguageEnum } from "../LanguageEnum"; +import { ICodeBlock } from "../interface/ICodeBlock"; +import PythonLexer from "../grammars-v4/python/python3_12/PythonLexer"; + +export abstract class PyCodeBlock implements ICodeBlock { + ctx: T + language: LanguageEnum + + constructor(ctx: T) { + this.ctx = ctx; + this.language = LanguageEnum.PYTHON; + } + + getClasses() { + throw new Error("Method getClasses() must be implemented"); + } + + getFunctions() { + throw new Error("Method getFunctions() must be implemented"); + } + + getMethods() { + throw new Error("Method getMethods() must be implemented"); + } + + getSimpleStatements(): Simple_stmtContext[] { + const visitor = new (class extends PythonParserVisitor { + simpleStatements: Simple_stmtContext[] = []; + visitSimple_stmt = (ctx: Simple_stmtContext): void => { + this.simpleStatements.push(ctx); + }; + })(); + + visitor.visit(this.ctx); + return visitor.simpleStatements + } + + getExpressions(): ExpressionContext[] { + const visitor = new (class extends PythonParserVisitor { + expressions: ExpressionContext[] = []; + visitExpression = (ctx: ExpressionContext): void => { + this.expressions.push(ctx); + }; + })(); + + visitor.visit(this.ctx); + return visitor.expressions; + } + + getMatches() { + const visitor = new (class extends PythonParserVisitor { + matches: Match_stmtContext[] = []; + visitMatch_stmt = (ctx: Match_stmtContext): void => { + this.matches.push(ctx); + }; + })(); + + visitor.visit(this.ctx); + return visitor.matches; + } + + getNumberLiterals(): Star_expressionContext[] { + const visitor = new (class extends PythonParserVisitor { + numberLiterals: Star_expressionContext[] = []; + visitStar_expression = (ctx: Star_expressionContext): void => { + if (this.anyTerminalsAreNumber(ctx)) { + this.numberLiterals.push(ctx); + } + }; + + anyTerminalsAreNumber = (ctx: any): boolean => { + if (ctx instanceof AtomContext && ctx.NUMBER()) { + return true; + } + for (let i = 0; i < ctx.getChildCount(); i++) { + if (this.anyTerminalsAreNumber(ctx.getChild(i))) { + return true; + } + } + return false; + }; + })(); + + visitor.visit(this.ctx); + return visitor.numberLiterals; + } + + getExcepts() { + const visitor = new (class extends PythonParserVisitor { + excepts: (Except_blockContext | Except_star_blockContext)[] = []; + visitExcept_block = (ctx: Except_blockContext): void => { + this.excepts.push(ctx); + }; + + visitExcept_star_block = (ctx: Except_star_blockContext): void => { + this.excepts.push(ctx); + }; + })(); + + visitor.visit(this.ctx); + return visitor.excepts; + } + + getIdentifiers(): string[] { + const visitor = new (class extends PythonParserVisitor { + identifiers: string[] = []; + + visitAssignment = (ctx: AssignmentContext): void => { + if (ctx.NAME()) { + // console.log("visit assignment: " + ctx.NAME().getText()); + this.identifiers.push(ctx.NAME().getText()); + } + this.visitChildren(ctx); + } + + visitSingle_target = (ctx: Single_targetContext): void => { + // ignore single_subscript_attribute_target as visit function for it defined below + if (ctx.NAME()) { + // console.log("visit single: " + ctx.NAME().getText()); + + this.identifiers.push(ctx.NAME().getText()); + } + // skip visitChildren as no need to get subscript_attribute_target + // this.visitChildren(ctx); // for recursive single_target + } + + visitT_primary = (ctx: T_primaryContext): void => { + if (ctx.atom()) { + this.visitAtom(ctx.atom()); + } else if (ctx.t_primary()) { + this.visitT_primary(ctx.t_primary()); + } + + if (ctx.NAME()) { + // console.log("visit primary: " + ctx.NAME().getText()); + + this.identifiers.push(ctx.NAME().getText()); + } + } + + // Visit atom to collect identifiers + visitAtom = (ctx: AtomContext): void => { + if (ctx.NAME()) { + // console.log("visit atom: " + ctx.NAME().getText()); + + this.identifiers.push(ctx.NAME().getText()); + } + } + + // Visit star_atom to collect identifiers + visitStar_atom = (ctx: Star_atomContext): void => { + if (ctx.NAME()) { + // console.log("visit star atom: " + ctx.NAME().getText()); + + this.identifiers.push(ctx.NAME().getText()); + } else if (ctx.target_with_star_atom()) { + this.visitTarget_with_star_atom(ctx.target_with_star_atom()); + } + } + + // Visit target_with_star_atom to recursively collect identifiers + visitTarget_with_star_atom = (ctx: Target_with_star_atomContext): void => { + if (ctx.t_primary()) { + this.visitT_primary(ctx.t_primary()); + } else if (ctx.star_atom()) { + this.visitStar_atom(ctx.star_atom()); + } + } + })(); + + visitor.visit(this.ctx); + return Array.from(visitor.identifiers); + } +} \ No newline at end of file diff --git a/codemetrica/language/python/PyFile.ts b/src/python/PyFile.ts similarity index 84% rename from codemetrica/language/python/PyFile.ts rename to src/python/PyFile.ts index 9bd58ff..c3365f5 100644 --- a/codemetrica/language/python/PyFile.ts +++ b/src/python/PyFile.ts @@ -1,9 +1,9 @@ -import PythonParserVisitor from "../../../grammars-v4/python/python3_12/PythonParserVisitor"; -import { Class_defContext, File_inputContext, Function_defContext } from "../../../grammars-v4/python/python3_12/PythonParser.js"; +import PythonParserVisitor from "../grammars-v4/python/python3_12/PythonParserVisitor"; +import { Class_defContext, File_inputContext, Function_defContext } from "../grammars-v4/python/python3_12/PythonParser.js"; import { PyCodeBlock } from "./PyCodeBlock"; import { PyClass } from "./PyClass"; import { PyFunction } from "./PyFunction"; -import { IFile } from "../../interface/IFile"; +import { IFile } from "../interface/IFile"; export class PyFile extends PyCodeBlock implements IFile { filePath: string | undefined = undefined; diff --git a/codemetrica/language/python/PyFunction.ts b/src/python/PyFunction.ts similarity index 69% rename from codemetrica/language/python/PyFunction.ts rename to src/python/PyFunction.ts index 438f4bc..df901a7 100644 --- a/codemetrica/language/python/PyFunction.ts +++ b/src/python/PyFunction.ts @@ -1,8 +1,8 @@ import { PyCodeBlock } from "./PyCodeBlock"; -import { Function_defContext } from "../../../grammars-v4/python/python3_12/PythonParser"; -import { IParameter } from "../../interface/IParameter"; -import { IFunction } from "../../interface/IFunction"; -import { IMethod } from "../../interface/IMethod"; +import { Function_defContext } from "../grammars-v4/python/python3_12/PythonParser"; +import { IParameter } from "../interface/IParameter"; +import { IFunction } from "../interface/IFunction"; +import { IMethod } from "../interface/IMethod"; import { PyParameter } from "./PyParameter"; export class PyFunction extends PyCodeBlock implements IFunction, IMethod { diff --git a/codemetrica/language/python/PyParameter.ts b/src/python/PyParameter.ts similarity index 82% rename from codemetrica/language/python/PyParameter.ts rename to src/python/PyParameter.ts index 6fae3f9..9febad0 100644 --- a/codemetrica/language/python/PyParameter.ts +++ b/src/python/PyParameter.ts @@ -1,4 +1,4 @@ -import { IParameter } from "../../interface/IParameter"; +import { IParameter } from "../interface/IParameter"; export class PyParameter implements IParameter { name: string; diff --git a/codemetrica/language/python/PyParser.ts b/src/python/PyParser.ts similarity index 70% rename from codemetrica/language/python/PyParser.ts rename to src/python/PyParser.ts index beb135a..7da1ebe 100644 --- a/codemetrica/language/python/PyParser.ts +++ b/src/python/PyParser.ts @@ -1,6 +1,6 @@ import antlr4 from 'antlr4'; -import PythonLexer from '../../../grammars-v4/python/python3_12/PythonLexer'; -import PythonParser from '../../../grammars-v4/python/python3_12/PythonParser'; +import PythonLexer from '../grammars-v4/python/python3_12/PythonLexer'; +import PythonParser from '../grammars-v4/python/python3_12/PythonParser'; export function parsePythonSource(sourceCode: string) { const inputStream = new antlr4.InputStream(sourceCode) as unknown as antlr4.CharStream;; diff --git a/codemetrica/language/python/index.ts b/src/python/index.ts similarity index 100% rename from codemetrica/language/python/index.ts rename to src/python/index.ts diff --git a/codemetrica/language/python/metric/CyclomaticComplexity.ts b/src/python/metric/CyclomaticComplexity.ts similarity index 77% rename from codemetrica/language/python/metric/CyclomaticComplexity.ts rename to src/python/metric/CyclomaticComplexity.ts index 005a82c..f4fb0d7 100644 --- a/codemetrica/language/python/metric/CyclomaticComplexity.ts +++ b/src/python/metric/CyclomaticComplexity.ts @@ -1,7 +1,6 @@ import { PyFunction } from '../PyFunction'; -import PythonParserVisitor from "../../../../grammars-v4/python/python3_12/PythonParserVisitor"; -import ParserRuleContext from 'antlr4/context/ParserRuleContext'; -import { Elif_stmtContext, ExpressionContext, For_stmtContext, If_stmtContext, Named_expressionContext, Try_stmtContext, While_stmtContext } from '../../../../grammars-v4/python/python3_12/PythonParser'; +import PythonParserVisitor from "../../grammars-v4/python/python3_12/PythonParserVisitor"; +import { Elif_stmtContext, ExpressionContext, For_stmtContext, If_stmtContext, Named_expressionContext, Try_stmtContext, While_stmtContext } from '../../grammars-v4/python/python3_12/PythonParser'; export class CyclomaticComplexity{ static calculate(method: PyFunction): number { @@ -10,7 +9,6 @@ export class CyclomaticComplexity{ visitIf_stmt = (ctx: If_stmtContext): void => { this.complexity++; - // console.log("**** Found IF", ctx.getText()); this.visitChildren(ctx); } @@ -21,14 +19,12 @@ export class CyclomaticComplexity{ visitWhile_stmt = (ctx: While_stmtContext): void => { this.complexity++; - // console.log("**** Found While", ctx.getText()); this.visitChildren(ctx); } visitFor_stmt = (ctx: For_stmtContext): void => { this.complexity++; - // console.log("**** Found For", ctx.getText()); return this.visitChildren(ctx); } @@ -42,7 +38,6 @@ export class CyclomaticComplexity{ count: number = 0; visitTerminal(node: any) { if (node.symbol.text === 'and' || node.symbol.text === 'or') { - console.log(node.symbol.text); this.count++; } } diff --git a/codemetrica/language/python/metric/MethodLength.ts b/src/python/metric/MethodLength.ts similarity index 100% rename from codemetrica/language/python/metric/MethodLength.ts rename to src/python/metric/MethodLength.ts diff --git a/codemetrica/language/python/smell/ComplexConditional.ts b/src/python/smell/ComplexConditional.ts similarity index 62% rename from codemetrica/language/python/smell/ComplexConditional.ts rename to src/python/smell/ComplexConditional.ts index f8a6e41..793dcf8 100644 --- a/codemetrica/language/python/smell/ComplexConditional.ts +++ b/src/python/smell/ComplexConditional.ts @@ -1,6 +1,6 @@ -import PythonParserVisitor from "../../../../grammars-v4/python/python3_12/PythonParserVisitor"; -import { Thresholds } from '../../../Thresholds'; -import { ExpressionContext } from "../../../../grammars-v4/python/python3_12/PythonParser"; +import PythonParserVisitor from "../../grammars-v4/python/python3_12/PythonParserVisitor"; +import { Thresholds } from '../../Thresholds'; +import { ExpressionContext } from "../../grammars-v4/python/python3_12/PythonParser"; export class ComplexConditional { static detect(ctx: ExpressionContext): boolean { diff --git a/codemetrica/language/python/smell/ComplexMethod.ts b/src/python/smell/ComplexMethod.ts similarity index 86% rename from codemetrica/language/python/smell/ComplexMethod.ts rename to src/python/smell/ComplexMethod.ts index 31255f5..ad77765 100644 --- a/codemetrica/language/python/smell/ComplexMethod.ts +++ b/src/python/smell/ComplexMethod.ts @@ -1,4 +1,4 @@ -import { Thresholds } from '../../../Thresholds'; +import { Thresholds } from '../../Thresholds'; import { CyclomaticComplexity } from '../metric/CyclomaticComplexity'; import { PyFunction } from '../PyFunction'; import { ComplexConditional } from './ComplexConditional'; diff --git a/src/python/smell/LazyClass.ts b/src/python/smell/LazyClass.ts new file mode 100644 index 0000000..e8ea506 --- /dev/null +++ b/src/python/smell/LazyClass.ts @@ -0,0 +1,9 @@ +import { Thresholds } from '../../Thresholds'; +import { PyClass } from "../PyClass"; + +export class LazyClass { + static detect(pyClass: PyClass): boolean { + const cloc = pyClass.ctx.stop!.line - pyClass.ctx.start.line; + return cloc < Thresholds.LAZY_CLASS_LOC; + } +} \ No newline at end of file diff --git a/src/python/smell/LongIdentifier.ts b/src/python/smell/LongIdentifier.ts new file mode 100644 index 0000000..2ef573a --- /dev/null +++ b/src/python/smell/LongIdentifier.ts @@ -0,0 +1,10 @@ +import { Thresholds } from '../../Thresholds'; +import { PyCodeBlock } from '../PyCodeBlock'; +import { PyFile } from '../PyFile'; + +export class LongIdentifier { + static detect(codeblock: PyCodeBlock): boolean { + const identifiers: string[] = codeblock.getIdentifiers(); + return identifiers.some(identifier => identifier.length > Thresholds.LONG_IDENTIFIER); + } +} \ No newline at end of file diff --git a/codemetrica/language/python/smell/LongMethod.ts b/src/python/smell/LongMethod.ts similarity index 83% rename from codemetrica/language/python/smell/LongMethod.ts rename to src/python/smell/LongMethod.ts index ab855db..819ec8e 100644 --- a/codemetrica/language/python/smell/LongMethod.ts +++ b/src/python/smell/LongMethod.ts @@ -1,4 +1,4 @@ -import { Thresholds } from '../../../Thresholds'; +import { Thresholds } from '../../Thresholds'; import { PyFunction } from '../PyFunction'; import { MethodLength } from '../metric/MethodLength'; diff --git a/codemetrica/language/python/smell/LongParameterList.ts b/src/python/smell/LongParameterList.ts similarity index 81% rename from codemetrica/language/python/smell/LongParameterList.ts rename to src/python/smell/LongParameterList.ts index 6dba2b8..6f5f66e 100644 --- a/codemetrica/language/python/smell/LongParameterList.ts +++ b/src/python/smell/LongParameterList.ts @@ -1,4 +1,4 @@ -import { Thresholds } from '../../../Thresholds'; +import { Thresholds } from '../../Thresholds'; import { PyFunction } from '../PyFunction'; export class LongParameterList{ diff --git a/codemetrica/language/python/smell/LongStatement.ts b/src/python/smell/LongStatement.ts similarity index 51% rename from codemetrica/language/python/smell/LongStatement.ts rename to src/python/smell/LongStatement.ts index 0b2346c..9f5effd 100644 --- a/codemetrica/language/python/smell/LongStatement.ts +++ b/src/python/smell/LongStatement.ts @@ -1,5 +1,5 @@ -import { Simple_stmtContext } from '../../../../grammars-v4/python/python3_12/PythonParser'; -import { Thresholds } from '../../../Thresholds'; +import { Simple_stmtContext } from '../../grammars-v4/python/python3_12/PythonParser'; +import { Thresholds } from '../../Thresholds'; export class LongStatement{ static detect(ctx: Simple_stmtContext): boolean { diff --git a/codemetrica/language/python/smell/MissingDefault.ts b/src/python/smell/MissingDefault.ts similarity index 55% rename from codemetrica/language/python/smell/MissingDefault.ts rename to src/python/smell/MissingDefault.ts index 6e94ec4..74943a4 100644 --- a/codemetrica/language/python/smell/MissingDefault.ts +++ b/src/python/smell/MissingDefault.ts @@ -1,6 +1,6 @@ -import { Simple_stmtContext } from '../../../../grammars-v4/python/python3_12/PythonParser'; -import PythonParserVisitor from '../../../../grammars-v4/python/python3_12/PythonParserVisitor'; -import { Soft_kw_wildcardContext } from '../../../../grammars-v4/python/python3_12/PythonParser'; +import { Simple_stmtContext } from '../../grammars-v4/python/python3_12/PythonParser'; +import PythonParserVisitor from '../../grammars-v4/python/python3_12/PythonParserVisitor'; +import { Soft_kw_wildcardContext } from '../../grammars-v4/python/python3_12/PythonParser'; export class MissingDefault { static detect(ctx: Simple_stmtContext): boolean { diff --git a/codemetrica/language/python/smell/index.ts b/src/python/smell/index.ts similarity index 100% rename from codemetrica/language/python/smell/index.ts rename to src/python/smell/index.ts diff --git a/codemetrica/smell/longMethod.ts b/src/smell/LongMethod.ts similarity index 82% rename from codemetrica/smell/longMethod.ts rename to src/smell/LongMethod.ts index 7f6879e..213bf42 100644 --- a/codemetrica/smell/longMethod.ts +++ b/src/smell/LongMethod.ts @@ -1,8 +1,8 @@ import { IMethod } from "../interface/IMethod"; import { IFunction } from "../interface/IFunction"; import { LanguageEnum } from "../LanguageEnum"; -import { MethodLength as JavaMethodLength } from "../language/java/metric/MethodLength"; -import { MethodLength as PyMethodLength } from "../language/python/metric/MethodLength"; +import { MethodLength as JavaMethodLength } from "../java/metric/MethodLength"; +import { MethodLength as PyMethodLength } from "../python/metric/MethodLength"; import { Thresholds } from "../Thresholds"; type MethodLengthCalculator = (method: any) => number; diff --git a/codemetrica/smell/index.ts b/src/smell/index.ts similarity index 100% rename from codemetrica/smell/index.ts rename to src/smell/index.ts