Skip to content

Commit e553553

Browse files
SONARPY-868 Serialize "annoy" library using mypy and protobuf (#939)
1 parent cd840d3 commit e553553

File tree

19 files changed

+619
-40
lines changed

19 files changed

+619
-40
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,7 @@ Desktop.ini
3131
# ---- Sonar
3232
.sonar
3333
.scannerwork
34+
35+
# ---- Python
36+
venv
37+
__pycache__

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@
44
[submodule "python-frontend/src/main/resources/org/sonar/python/types/typeshed"]
55
path = python-frontend/src/main/resources/org/sonar/python/types/typeshed
66
url = https://github.com/python/typeshed.git
7+
# TODO: Remove duplicated Typeshed once we now longer rely on parsing it ourselves
8+
[submodule "tools/typeshed_serializer/resources/typeshed"]
9+
path = python-frontend/typeshed_serializer/resources/typeshed
10+
url = https://github.com/python/typeshed.git

python-frontend/pom.xml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,18 @@
6969
<outputDirectory>${project.build.directory}/generated-sources/protobuf</outputDirectory>
7070
</configuration>
7171
</execution>
72+
<execution>
73+
<id>generate-protobuf-python-sources</id>
74+
<goals>
75+
<goal>compile-python</goal>
76+
</goals>
77+
<configuration>
78+
<protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
79+
</protocArtifact>
80+
<protoSourceRoot>${project.basedir}/src/main/protobuf</protoSourceRoot>
81+
<outputDirectory>${project.basedir}/typeshed_serializer/serializer/proto_out</outputDirectory>
82+
</configuration>
83+
</execution>
7284
</executions>
7385
<dependencies>
7486
<dependency>
@@ -101,4 +113,52 @@
101113
</plugin>
102114
</plugins>
103115
</build>
116+
117+
<profiles>
118+
<profile>
119+
<id>
120+
typeshed_serializer
121+
</id>
122+
<activation>
123+
<property>
124+
<name>
125+
generateTypeshed
126+
</name>
127+
</property>
128+
</activation>
129+
<build>
130+
<plugins>
131+
<plugin>
132+
<groupId>org.codehaus.mojo</groupId>
133+
<artifactId>exec-maven-plugin</artifactId>
134+
<version>1.6.0</version>
135+
<configuration>
136+
<workingDirectory>typeshed_serializer</workingDirectory>
137+
</configuration>
138+
<executions>
139+
<execution>
140+
<id>tox</id>
141+
<phase>generate-resources</phase>
142+
<configuration>
143+
<executable>tox</executable>
144+
</configuration>
145+
<goals>
146+
<goal>exec</goal>
147+
</goals>
148+
</execution>
149+
<execution>
150+
<id>tox -e serialize</id>
151+
<phase>generate-resources</phase>
152+
<goals><goal>exec</goal></goals>
153+
<configuration>
154+
<executable>tox</executable>
155+
<arguments>-e serialize</arguments>
156+
</configuration>
157+
</execution>
158+
</executions>
159+
</plugin>
160+
</plugins>
161+
</build>
162+
</profile>
163+
</profiles>
104164
</project>

python-frontend/src/main/java/org/sonar/python/semantic/FunctionSymbolImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ public FunctionSymbolImpl(SymbolsProtos.FunctionSymbol functionSymbolProto, bool
8989
super(functionSymbolProto.getName(), functionSymbolProto.getFullyQualifiedName());
9090
setKind(Kind.FUNCTION);
9191
isInstanceMethod = insideClass && !functionSymbolProto.getIsStatic() && !functionSymbolProto.getIsClassMethod();
92-
isAsynchronous = functionSymbolProto.getIsCoroutine() || functionSymbolProto.getIsAsyncGenerator();
92+
isAsynchronous = functionSymbolProto.getIsAsynchronous();
9393
hasDecorators = functionSymbolProto.getHasDecorators();
9494
decorators = functionSymbolProto.getResolvedDecoratorNamesList();
9595
SymbolsProtos.Type returnAnnotation = functionSymbolProto.getReturnAnnotation();
96-
String returnTypeName = returnAnnotation.getSimpleName();
96+
String returnTypeName = returnAnnotation.getFullyQualifiedName();
9797
annotatedReturnTypeName = returnTypeName.isEmpty() ? null : returnTypeName;
9898
for (SymbolsProtos.ParameterSymbol parameterSymbol : functionSymbolProto.getParametersList()) {
9999
ParameterState parameterState = new ParameterState();

python-frontend/src/main/java/org/sonar/python/types/InferredTypes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public static InferredType fromTypeshedTypeAnnotation(TypeAnnotation typeAnnotat
158158
public static InferredType fromTypeshedProtobuf(SymbolsProtos.Type type) {
159159
switch (type.getKind()) {
160160
case INSTANCE:
161-
String typeName = type.getSimpleName();
161+
String typeName = type.getFullyQualifiedName();
162162
return typeName.isEmpty() ? anyType() : runtimeType(TypeShed.symbolWithFQN(typeName));
163163
case TYPE_ALIAS:
164164
case CALLABLE:

python-frontend/src/main/protobuf/symbols.proto

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ message Type {
3434
string pretty_printed_name = 1;
3535
TypeKind kind = 2;
3636
repeated Type args = 3;
37-
optional string simple_name = 4;
37+
optional string fully_qualified_name = 4;
3838
}
3939

4040
message ParameterSymbol {
@@ -52,23 +52,18 @@ message FunctionSymbol {
5252
bool has_decorators = 6;
5353
repeated string resolved_decorator_names = 7;
5454
bool is_abstract = 8;
55-
bool is_async_generator = 9;
56-
bool is_awaitable_coroutine = 10;
57-
bool is_coroutine = 11;
58-
bool is_final = 12;
59-
bool is_overload = 13;
60-
bool is_property = 14;
61-
bool is_static = 15;
62-
bool is_class_method = 16;
55+
bool is_asynchronous = 9;
56+
bool is_final = 10;
57+
bool is_overload = 11;
58+
bool is_property = 12;
59+
bool is_static = 13;
60+
bool is_class_method = 14;
6361
}
6462

6563
message OverloadedFunctionSymbol {
6664
string name = 1;
6765
string fullname = 2;
68-
bool is_final = 3;
69-
bool is_property = 4;
70-
bool is_static = 5;
71-
repeated FunctionSymbol definitions = 6;
66+
repeated FunctionSymbol definitions = 3;
7267
}
7368

7469
message ClassSymbol {
@@ -82,10 +77,8 @@ message ClassSymbol {
8277
bool has_metaclass = 9;
8378
bool is_enum = 10;
8479
bool is_generic = 11;
85-
bool is_named_tuple = 12;
86-
bool is_protocol = 13;
87-
optional string metaclass_name = 14;
88-
optional Type metaclass_type = 15;
80+
bool is_protocol = 12;
81+
optional string metaclass_name = 13;
8982
}
9083

9184
message ModuleSymbol {

python-frontend/src/main/resources/org/sonar/python/types/protobuf/annoy.protobuf

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
self
77
annoy._Vector"annoy._Vector*!
88
i
9-
builtins.int" builtins.inth�/
9+
builtins.int" builtins.int`�/
1010

1111
AnnoyIndexannoy.AnnoyIndex"builtins.object2�
1212
__init__annoy.AnnoyIndex.__init__"
@@ -114,8 +114,8 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
114114
self$
115115
annoy.AnnoyIndex"annoy.AnnoyIndex*#
116116
__s
117-
builtins.int" builtins.int:�
118-
get_nns_by_item annoy.AnnoyIndex.get_nns_by_item2�
117+
builtins.int" builtins.int:�
118+
get_nns_by_item annoy.AnnoyIndex.get_nns_by_item�
119119
get_nns_by_item annoy.AnnoyIndex.get_nns_by_item"J
120120
builtins.list[builtins.int]
121121
builtins.int" builtins.int"builtins.list*.
@@ -129,7 +129,7 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
129129
builtins.int" builtins.int *S
130130
include_distances:
131131
Literal[builtins.bool] 
132-
builtins.bool"builtins.bool 0:typing.overloadh2�
132+
builtins.bool"builtins.bool 0:overloadX�
133133
get_nns_by_item annoy.AnnoyIndex.get_nns_by_item"�
134134
@Tuple[builtins.list[builtins.int],builtins.list[builtins.float]]J
135135
builtins.list[builtins.int]
@@ -146,7 +146,7 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
146146
builtins.int" builtins.int*Q
147147
include_distances:
148148
Literal[builtins.bool] 
149-
builtins.bool"builtins.bool0:typing.overloadh2�
149+
builtins.bool"builtins.bool0:overloadX�
150150
get_nns_by_item annoy.AnnoyIndex.get_nns_by_item"�
151151
@Tuple[builtins.list[builtins.int],builtins.list[builtins.float]]J
152152
builtins.list[builtins.int]
@@ -163,8 +163,8 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
163163
builtins.int" builtins.int *Q
164164
include_distances:
165165
Literal[builtins.bool] 
166-
builtins.bool"builtins.bool0:typing.overloadh:�
167-
get_nns_by_vector"annoy.AnnoyIndex.get_nns_by_vector2�
166+
builtins.bool"builtins.bool0:overloadX:�
167+
get_nns_by_vector"annoy.AnnoyIndex.get_nns_by_vector�
168168
get_nns_by_vector"annoy.AnnoyIndex.get_nns_by_vector"J
169169
builtins.list[builtins.int]
170170
builtins.int" builtins.int"builtins.list*.
@@ -178,7 +178,7 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
178178
builtins.int" builtins.int *S
179179
include_distances:
180180
Literal[builtins.bool] 
181-
builtins.bool"builtins.bool 0:typing.overloadh2�
181+
builtins.bool"builtins.bool 0:overloadX�
182182
get_nns_by_vector"annoy.AnnoyIndex.get_nns_by_vector"�
183183
@Tuple[builtins.list[builtins.int],builtins.list[builtins.float]]J
184184
builtins.list[builtins.int]
@@ -195,7 +195,7 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
195195
builtins.int" builtins.int*Q
196196
include_distances:
197197
Literal[builtins.bool] 
198-
builtins.bool"builtins.bool0:typing.overloadh2�
198+
builtins.bool"builtins.bool0:overloadX�
199199
get_nns_by_vector"annoy.AnnoyIndex.get_nns_by_vector"�
200200
@Tuple[builtins.list[builtins.int],builtins.list[builtins.float]]J
201201
builtins.list[builtins.int]
@@ -212,4 +212,4 @@ tUnion[Literal[builtins.str],Literal[builtins.str],Literal[builtins.str],Literal
212212
builtins.int" builtins.int *Q
213213
include_distances:
214214
Literal[builtins.bool] 
215-
builtins.bool"builtins.bool0:typing.overloadh
215+
builtins.bool"builtins.bool0:overloadX

python-frontend/src/test/java/org/sonar/python/semantic/ClassSymbolImplTest.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,7 @@ public void from_protobuf() throws TextFormat.ParseException {
237237
"super_classes: \"builtins.object\"\n" +
238238
"has_decorators: true\n" +
239239
"has_metaclass: true\n" +
240-
"metaclass_name: \"abc.ABCMeta\"\n" +
241-
"metaclass_type {\n" +
242-
" pretty_printed_name: \"abc.ABCMeta\"\n" +
243-
" simple_name: \"abc.ABCMeta\"\n" +
244-
"}";
240+
"metaclass_name: \"abc.ABCMeta\"";
245241
ClassSymbolImpl classSymbol = new ClassSymbolImpl(classSymbol(protobuf));
246242
assertThat(classSymbol.name()).isEqualTo("A");
247243
assertThat(classSymbol.fullyQualifiedName()).isEqualTo("mod.A");

python-frontend/src/test/java/org/sonar/python/semantic/FunctionSymbolTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public void from_protobuf() throws TextFormat.ParseException {
269269
" kind: POSITIONAL_OR_KEYWORD\n" +
270270
" type_annotation {\n" +
271271
" pretty_printed_name: \"builtins.str\"\n" +
272-
" simple_name: \"builtins.str\"\n" +
272+
" fully_qualified_name: \"builtins.str\"\n" +
273273
" }\n" +
274274
"}\n" +
275275
"parameters {\n" +

python-frontend/src/test/java/org/sonar/python/types/InferredTypesTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,19 +344,19 @@ public void test_type_from_protobuf() throws TextFormat.ParseException {
344344
assertThat(protobufType("kind: TUPLE")).isEqualTo(TUPLE);
345345
assertThat(protobufType(
346346
"pretty_printed_name: \"builtins.str\"\n" +
347-
"simple_name: \"builtins.str\"\n")).isEqualTo(STR);
347+
"fully_qualified_name: \"builtins.str\"\n")).isEqualTo(STR);
348348
assertThat(protobufType(
349349
"kind: TYPE_ALIAS\n" +
350350
"args {\n" +
351351
" kind: UNION\n" +
352352
" args {\n" +
353-
" simple_name: \"builtins.str\"\n" +
353+
" fully_qualified_name: \"builtins.str\"\n" +
354354
" }\n" +
355355
" args {\n" +
356-
" simple_name: \"builtins.int\"\n" +
356+
" fully_qualified_name: \"builtins.int\"\n" +
357357
" }\n" +
358358
"}\n" +
359-
"simple_name: \"mod.t\""
359+
"fully_qualified_name: \"mod.t\""
360360
))
361361
.isEqualTo(InferredTypes.or(STR, INT));
362362
}

0 commit comments

Comments
 (0)