diff --git a/src/codemodder/codeql.py b/src/codemodder/codeql.py index 0f976adc..09bffa64 100644 --- a/src/codemodder/codeql.py +++ b/src/codemodder/codeql.py @@ -14,6 +14,10 @@ def detect(cls, run_data: dict) -> bool: class CodeQLLocation(SarifLocation): + @staticmethod + def get_snippet(sarif_location) -> str: + return "" + @classmethod def from_sarif(cls, sarif_location) -> Self: artifact_location = sarif_location["physicalLocation"]["artifactLocation"] diff --git a/src/codemodder/result.py b/src/codemodder/result.py index a5aff86f..aeb97eee 100644 --- a/src/codemodder/result.py +++ b/src/codemodder/result.py @@ -35,11 +35,28 @@ class Location(ABCDataclass): @dataclass(frozen=True) class SarifLocation(Location): - @classmethod + @staticmethod @abstractmethod - def from_sarif(cls, sarif_location) -> Self: + def get_snippet(sarif_location) -> str: pass + @classmethod + def from_sarif(cls, sarif_location) -> Self: + artifact_location = sarif_location["physicalLocation"]["artifactLocation"] + file = Path(artifact_location["uri"]) + snippet = cls.get_snippet(sarif_location) + start = LineInfo( + line=sarif_location["physicalLocation"]["region"]["startLine"], + column=sarif_location["physicalLocation"]["region"]["startColumn"], + snippet=snippet, + ) + end = LineInfo( + line=sarif_location["physicalLocation"]["region"]["endLine"], + column=sarif_location["physicalLocation"]["region"]["endColumn"], + snippet=snippet, + ) + return cls(file=file, start=start, end=end) + @dataclass(frozen=True) class LocationWithMessage: diff --git a/src/codemodder/semgrep.py b/src/codemodder/semgrep.py index 5884f1e2..699eaa83 100644 --- a/src/codemodder/semgrep.py +++ b/src/codemodder/semgrep.py @@ -9,7 +9,7 @@ from codemodder.context import CodemodExecutionContext from codemodder.logging import logger -from codemodder.result import LineInfo, Result, ResultSet, SarifLocation, SarifResult +from codemodder.result import Result, ResultSet, SarifLocation, SarifResult from codemodder.sarifs import AbstractSarifToolDetector @@ -23,24 +23,11 @@ def detect(cls, run_data: dict) -> bool: class SemgrepLocation(SarifLocation): - @classmethod - def from_sarif(cls, sarif_location) -> Self: - artifact_location = sarif_location["physicalLocation"]["artifactLocation"] - file = Path(artifact_location["uri"]) - snippet = ( + @staticmethod + def get_snippet(sarif_location) -> str: + return ( sarif_location["physicalLocation"]["region"].get("snippet", {}).get("text") ) - start = LineInfo( - line=sarif_location["physicalLocation"]["region"]["startLine"], - column=sarif_location["physicalLocation"]["region"]["startColumn"], - snippet=snippet, - ) - end = LineInfo( - line=sarif_location["physicalLocation"]["region"]["endLine"], - column=sarif_location["physicalLocation"]["region"]["endColumn"], - snippet=snippet, - ) - return cls(file=file, start=start, end=end) class SemgrepResult(SarifResult):