Skip to content

Commit

Permalink
Restructure project
Browse files Browse the repository at this point in the history
  • Loading branch information
rafed committed Nov 7, 2024
1 parent e455b8c commit fadf3ee
Show file tree
Hide file tree
Showing 66 changed files with 250 additions and 160 deletions.
105 changes: 0 additions & 105 deletions codemetrica/language/python/PyCodeBlock.ts

This file was deleted.

File renamed without changes.
File renamed without changes.
8 changes: 4 additions & 4 deletions codemetrica/ParseSource.ts → src/ParseSource.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
4 changes: 4 additions & 0 deletions codemetrica/thresholds.ts → src/Thresholds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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<NormalClassDeclarationContext> {
constructor(ctx: NormalClassDeclarationContext) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T extends ParserRuleContext> {
ctx: T
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CompilationUnitContext> implements IFile{
filePath: string | undefined;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MethodDeclarationContext> implements IMethod {
constructor(ctx: MethodDeclarationContext) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IParameter } from "../../interface/IParameter";
import { IParameter } from "../interface/IParameter";

export class JavaParameter implements IParameter {
name: string;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions codemetrica/language/java/parser.ts → src/java/parser.ts
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
10 changes: 5 additions & 5 deletions codemetrica/language/python/PyClass.ts → src/python/PyClass.ts
Original file line number Diff line number Diff line change
@@ -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<Class_defContext> implements IClass {
constructor(ctx: Class_defContext) {
Expand Down
177 changes: 177 additions & 0 deletions src/python/PyCodeBlock.ts
Original file line number Diff line number Diff line change
@@ -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<T extends ParserRuleContext> 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<void> {
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<void> {
expressions: ExpressionContext[] = [];
visitExpression = (ctx: ExpressionContext): void => {
this.expressions.push(ctx);
};
})();

visitor.visit(this.ctx);
return visitor.expressions;
}

getMatches() {
const visitor = new (class extends PythonParserVisitor<void> {
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<void> {
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<void> {
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<void> {
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);
}
}
Loading

0 comments on commit fadf3ee

Please sign in to comment.