From 833a75df6102f19115180aea198f689577debdab Mon Sep 17 00:00:00 2001 From: willeand Date: Tue, 4 Jun 2024 10:10:15 -0700 Subject: [PATCH] Code Smell Long-Method Completed version 1.0 --- output/data.json | 2 +- package.json | 4 ++++ src/extension.ts | 7 +++++- src/longMethod.ts | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/longMethod.ts diff --git a/output/data.json b/output/data.json index ec9168a..735f46e 100644 --- a/output/data.json +++ b/output/data.json @@ -1 +1 @@ -{"3":["Improper Capitalized Primitive Type"],"4":["Improper Capitalized Primitive Type"],"7":["Lowercase ENUM found!"],"18":["Improper Capitalized Primitive Type","Improper Capitalized Primitive Type"],"19":["Improper Capitalized Primitive Type","Improper Capitalized Primitive Type"],"20":["Improper Capitalized Primitive Type"],"35":["Improper Capitalized Primitive Type"],"179":["enum fruit"]} \ No newline at end of file +{"3":["Improper Capitalized Primitive Type"],"4":["Improper Capitalized Primitive Type"],"12":["Code Smell: Consider refactoring to reduce method length"],"15":["Improper Capitalized Primitive Type","Improper Capitalized Primitive Type"],"16":["Improper Capitalized Primitive Type","Improper Capitalized Primitive Type"],"17":["Improper Capitalized Primitive Type"],"31":["Code Smell: Consider refactoring to reduce method length"],"50":["Improper Capitalized Primitive Type"]} \ No newline at end of file diff --git a/package.json b/package.json index 7207e18..2475643 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,10 @@ { "command": "extension.findDuplicateCode", "title": "findDuplicateCode" + }, + { + "command": "extension.longMethod", + "title": "findLongMethod" } ], "menus": { diff --git a/src/extension.ts b/src/extension.ts index 7f6f97b..7df4241 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -11,9 +11,10 @@ import { convertMapToJson } from './convertMapToJson'; import { findDuplicateCode } from './findDuplicateCode'; import { findLowercaseEnums } from './findLowercaseEnums'; import { findConstantCap} from './findConstantCap'; +import { longMethod } from './longMethod'; const myMap: Map = new Map(); -const filePath = 'C:\\Users\\Will\\Desktop\\cww\\gradeFast-1.0\\output\\data.json'; +const filePath = 'C:\\Users\\Will\\Desktop\\cw\\gradeFast-1.0\\output\\data.json'; export function activate(context: vscode.ExtensionContext) { @@ -54,5 +55,9 @@ export function activate(context: vscode.ExtensionContext) { } }; + const disposable7 = vscode.commands.registerCommand('extension.longMethod', () => { + longMethod(myMap); + } ); + NoteCommentController.registerCommands(context); } diff --git a/src/longMethod.ts b/src/longMethod.ts new file mode 100644 index 0000000..aa82622 --- /dev/null +++ b/src/longMethod.ts @@ -0,0 +1,60 @@ +import * as vscode from 'vscode'; + +export function longMethod(myMap: Map): Map { + // Check for active text editor + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showErrorMessage('No active text editor.'); + return myMap; // Early return if no editor + } + + // Get the document text + const document = editor.document; + const text = document.getText(); + + // Pattern to identify method definitions + const methodPattern = /(\b(?:public|protected|private|static|\s)+[^\s]+\s+[^\s]+\s*\([^)]*\)\s*{)/g; + + let match; + while ((match = methodPattern.exec(text)) !== null) { + const startPos = document.positionAt(match.index); + const startLine = startPos.line; + + // Count the number of lines in the method + const methodLines = countMethodLines(document, startLine); + + if (methodLines > 10) { + const errorMessage = "Code Smell: Consider refactoring to reduce method length"; + if (!myMap.has(startLine)) { + myMap.set(startLine, []); + } + const currentErrors = myMap.get(startLine) || []; + currentErrors.push(errorMessage); + myMap.set(startLine, currentErrors); + } + } + + return myMap; +} + +// Helper function to count method lines +function countMethodLines(document: vscode.TextDocument, startLine: number): number { + let lineNumber = startLine; + let methodOpen = true; + let openBraces = 0; + let closeBraces = 0; + + while (lineNumber < document.lineCount && methodOpen) { + const lineText = document.lineAt(lineNumber).text.trim(); + openBraces += (lineText.match(/{/g) || []).length; + closeBraces += (lineText.match(/}/g) || []).length; + + if (closeBraces > 0 && openBraces === closeBraces) { + methodOpen = false; + } + + lineNumber++; + } + + return lineNumber - startLine; +}