CPPFileExtension.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package diff;
  2. import net.sourceforge.pmd.lang.cpp.ast.CppParserConstants;
  3. import net.sourceforge.pmd.lang.cpp.ast.Token;
  4. import net.sourceforge.pmd.lang.cpp.CppTokenManager;
  5. import org.eclipse.jgit.diff.HistogramDiff;
  6. import org.eclipse.jgit.diff.Edit;
  7. import java.util.List;
  8. import java.util.ArrayList;
  9. import java.util.HashSet;
  10. import java.util.Set;
  11. import java.io.Reader;
  12. import java.io.IOException;
  13. import org.slf4j.Logger;
  14. public class CPPFileExtension {
  15. private CppTokenManager tokenManager;
  16. private List<Token> tokens;
  17. public CPPFileExtension(String filePath, Reader reader) {
  18. this.tokenManager = new CppTokenManager(reader);
  19. }
  20. private List<Token> getTokens() {
  21. if (tokens == null) {
  22. this.tokens = new ArrayList<Token>();
  23. for(Token token = (Token) tokenManager.getNextToken();
  24. token.kind != CppParserConstants.EOF;
  25. token = (Token) tokenManager.getNextToken()) {
  26. this.tokens.add(token);
  27. }
  28. }
  29. return this.tokens;
  30. }
  31. public Set<Integer> allLineNumbers() {
  32. List<Token> tokens = this.getTokens();
  33. Set<Integer> lines = new HashSet<>();
  34. for (Token t : tokens) {
  35. lines.add(t.beginLine);
  36. }
  37. return lines;
  38. }
  39. public Set<Integer> affectedLineNumbers(CPPFileExtension fileToCompare) {
  40. Set<Integer> affectedLines = new HashSet<>();
  41. TokenSequence tokens1 = new TokenSequence(this.getTokens());
  42. TokenSequence tokens2 = new TokenSequence(fileToCompare.getTokens());
  43. HistogramDiff diff = new HistogramDiff();
  44. List<Edit> tokdiff = diff.diff(new TokenComparator(), tokens1, tokens2);
  45. tokdiff.forEach(it -> {
  46. for (int i = it.getBeginB(); i <= it.getEndB(); i++) {
  47. Token t = tokens2.tokens.get(i);
  48. affectedLines.add(t.beginLine);
  49. }
  50. }
  51. );
  52. return affectedLines;
  53. }
  54. }