Skip to content

Commit 1eca118

Browse files
committed
Rust: Add inline expectations test for type inference
1 parent e6cf737 commit 1eca118

8 files changed

Lines changed: 1197 additions & 1198 deletions

File tree

rust/ql/lib/codeql/rust/elements/internal/FunctionImpl.qll

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
private import codeql.rust.elements.internal.generated.Function
8+
private import codeql.rust.elements.Comment
89

910
/**
1011
* INTERNAL: This module contains the customizable definition of `Function` and should not
@@ -26,5 +27,22 @@ module Impl {
2627
*/
2728
class Function extends Generated::Function {
2829
override string toStringImpl() { result = "fn " + this.getName().getText() }
30+
31+
/**
32+
* Gets a comment preceeding this function.
33+
*
34+
* A comment is considered preceeding if it occurs immediately before this
35+
* function or if only other comments occur between the comment and this
36+
* function.
37+
*/
38+
Comment getPreceedingComment() {
39+
result.getLocation().getFile() = this.getLocation().getFile() and
40+
// When a function is preceded by comments its start line is the line of
41+
// the first comment. Hence all relevant comments are found by including
42+
// comments from the start line and up to the line with the function
43+
// name.
44+
this.getLocation().getStartLine() <= result.getLocation().getStartLine() and
45+
result.getLocation().getStartLine() <= this.getName().getLocation().getStartLine()
46+
}
2947
}
3048
}

rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,15 @@ module Impl {
4343
}
4444

4545
override string toStringImpl() {
46-
exists(string base, string separator |
46+
exists(string base, string separator, string parenthesis |
4747
base = this.getReceiver().toAbbreviatedString() and
4848
(if base = "..." then separator = " ." else separator = ".") and
49-
result = base + separator + this.getIdentifier().toStringImpl() + "(...)"
49+
(
50+
if this.getArgList().getNumberOfArgs() = 0
51+
then parenthesis = "()"
52+
else parenthesis = "(...)"
53+
) and
54+
result = base + separator + this.getIdentifier().toStringImpl() + parenthesis
5055
)
5156
}
5257
}

rust/ql/lib/codeql/rust/internal/Type.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class StructType extends StructOrEnumType, TStruct {
104104
result = TTypeParamTypeParameter(struct.getGenericParamList().getTypeParam(i))
105105
}
106106

107-
override string toString() { result = struct.toString() }
107+
override string toString() { result = struct.getName().getText() }
108108

109109
override Location getLocation() { result = struct.getLocation() }
110110
}
@@ -125,7 +125,7 @@ class EnumType extends StructOrEnumType, TEnum {
125125
result = TTypeParamTypeParameter(enum.getGenericParamList().getTypeParam(i))
126126
}
127127

128-
override string toString() { result = enum.toString() }
128+
override string toString() { result = enum.getName().getText() }
129129

130130
override Location getLocation() { result = enum.getLocation() }
131131
}

rust/ql/lib/utils/test/InlineMadTest.qll

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,7 @@ private module InlineMadTestLang implements InlineMadTestLangSig {
55
class Callable = R::Function;
66

77
string getComment(R::Function callable) {
8-
exists(R::Comment comment |
9-
result = comment.getCommentText() and
10-
comment.getLocation().getFile() = callable.getLocation().getFile() and
11-
// When a function is preceded by comments its start line is the line of
12-
// the first comment. Hence all relevant comments are found by including
13-
// comments from the start line and up to the line with the function
14-
// name.
15-
callable.getLocation().getStartLine() <= comment.getLocation().getStartLine() and
16-
comment.getLocation().getStartLine() <= callable.getName().getLocation().getStartLine()
17-
)
8+
result = callable.getPreceedingComment().getCommentText()
189
}
1910
}
2011

rust/ql/test/library-tests/type-inference/loop/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ trait T1<T>: T2<S<T>> {
99

1010
trait T2<T>: T1<S<T>> {
1111
fn bar(self) {
12-
self.foo()
12+
self.foo() // $ method=foo
1313
}
1414
}

0 commit comments

Comments
 (0)