mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 19:49:36 +00:00
[analyzer; new edges] Omit subexpression back-edges that span multiple lines.
A.1 -> A -> B becomes A.1 -> B This only applies if there's an edge from a subexpression to its parent expression, and that is immediately followed by another edge from the parent expression to a subsequent expression. Normally this is useful for bringing the edges back to the left side of the code, but when the subexpression is on a different line the backedge ends up looking strange, and may even obscure code. In these cases, it's better to just continue to the next top-level statement. llvm-svn: 183164
This commit is contained in:
parent
5f16849b34
commit
7ce598aeee
@ -2092,7 +2092,7 @@ static void simplifySimpleBranches(PathPieces &pieces) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the number of bytes in the given SourceRange.
|
||||
/// Returns the number of bytes in the given (character-based) SourceRange.
|
||||
///
|
||||
/// If the locations in the range are not on the same line, returns None.
|
||||
///
|
||||
@ -2413,6 +2413,21 @@ static bool optimizeEdges(PathPieces &path, SourceManager &SM,
|
||||
!lexicalContains(PM, s1End, s1Start)) {
|
||||
removeEdge = true;
|
||||
}
|
||||
// Trim edges from a subexpression back to the top level if the
|
||||
// subexpression is on a different line.
|
||||
//
|
||||
// A.1 -> A -> B
|
||||
// becomes
|
||||
// A.1 -> B
|
||||
//
|
||||
// These edges just look ugly and don't usually add anything.
|
||||
else if (s1Start && s2End &&
|
||||
lexicalContains(PM, s1Start, s1End)) {
|
||||
SourceRange EdgeRange(PieceI->getEndLocation().asLocation(),
|
||||
PieceI->getStartLocation().asLocation());
|
||||
if (!getLengthOnSingleLine(SM, EdgeRange).hasValue())
|
||||
removeEdge = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (removeEdge) {
|
||||
|
@ -12885,40 +12885,6 @@ void longLines() {
|
||||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>535</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>535</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>4</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
// CHECK-NEXT: <key>edges</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>535</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>535</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>4</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>537</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
|
Loading…
Reference in New Issue
Block a user