Skip to content

Commit 039614e

Browse files
committed
Add auto-generated user function documentation
1 parent 81e5a2c commit 039614e

File tree

8 files changed

+121
-5
lines changed

8 files changed

+121
-5
lines changed

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/metadata/CypherMetadataProviderService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
public interface CypherMetadataProviderService {
99

10+
void wipeAll();
11+
1012
void wipeContainer(String sourceId);
1113

1214
CypherMetadataContainer getContainer(String sourceId);
@@ -22,4 +24,6 @@ public interface CypherMetadataProviderService {
2224
List<CypherUserFunctionElement> getUserFunctions();
2325

2426
Optional<CypherProcedureElement> findProcedure(String fullName);
27+
28+
Optional<CypherUserFunctionElement> findUserFunction(String fullName);
2529
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/metadata/CypherMetadataProviderServiceImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ public CypherMetadataProviderServiceImpl() {
1616
sourceData = new HashMap<>();
1717
}
1818

19+
@Override
20+
public void wipeAll() {
21+
sourceData.clear();
22+
}
23+
1924
@Override
2025
public void wipeContainer(String sourceId) {
2126
sourceData.remove(sourceId);
@@ -77,4 +82,13 @@ public Optional<CypherProcedureElement> findProcedure(String name) {
7782
.filter((procedureElement) -> procedureElement.getName().equals(name))
7883
.findFirst();
7984
}
85+
86+
@Override
87+
public Optional<CypherUserFunctionElement> findUserFunction(String name) {
88+
return sourceData.entrySet().stream()
89+
.map(Map.Entry::getValue)
90+
.flatMap((container) -> container.getUserFunctions().stream())
91+
.filter((userFunctionElement) -> userFunctionElement.getName().equals(name))
92+
.findFirst();
93+
}
8094
}

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/metadata/elements/CypherProcedureElement.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import com.neueda.jetbrains.plugin.graphdb.platform.GraphIcons;
77
import org.jetbrains.annotations.Nullable;
88

9-
public class CypherProcedureElement implements CypherElement, CypherElementWithSignature, CypherElementWithDocumentation {
9+
public class CypherProcedureElement implements
10+
CypherElement,
11+
CypherElementWithSignature,
12+
CypherElementWithDocumentation {
1013

1114
private final String name;
1215
@Nullable
@@ -32,7 +35,7 @@ public InvokableInformation getInvokableInformation() {
3235
public String getDocumentation() {
3336
if (documentation == null) {
3437
documentation = ""
35-
+ "<b>" + name + "</b><br>"
38+
+ "procedure <b>" + name + "</b><br>"
3639
+ "Arguments:<br>"
3740
+ "&nbsp;&nbsp;&nbsp;&nbsp;" + invokableInformation.getSignature() + "<br>"
3841
+ "Return:<br>"

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/completion/metadata/elements/CypherUserFunctionElement.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,50 @@
66
import com.neueda.jetbrains.plugin.graphdb.platform.GraphIcons;
77
import org.jetbrains.annotations.Nullable;
88

9-
public class CypherUserFunctionElement implements CypherElement, CypherElementWithSignature {
9+
public class CypherUserFunctionElement implements
10+
CypherElement,
11+
CypherElementWithSignature,
12+
CypherElementWithDocumentation {
13+
1014
private final String name;
15+
@Nullable
16+
private final String description;
1117
private final InvokableInformation invokableInformation;
18+
private String documentation;
1219

1320
public CypherUserFunctionElement(String name, String signature, @Nullable String description) {
1421
this.name = name;
22+
this.description = description;
1523
this.invokableInformation = extractInformation(signature, name);
1624
}
1725

26+
public String getName() {
27+
return name;
28+
}
29+
1830
@Override
1931
public InvokableInformation getInvokableInformation() {
2032
return invokableInformation;
2133
}
2234

35+
@Override
36+
public String getDocumentation() {
37+
if (documentation == null) {
38+
documentation = ""
39+
+ "function <b>" + name + "</b><br>"
40+
+ "Arguments:<br>"
41+
+ "&nbsp;&nbsp;&nbsp;&nbsp;" + invokableInformation.getSignature() + "<br>"
42+
+ "Return:<br>"
43+
+ "&nbsp;&nbsp;&nbsp;&nbsp;" + invokableInformation.getReturnType();
44+
45+
if (description != null) {
46+
documentation += "<br><br>"
47+
+ description;
48+
}
49+
}
50+
return documentation;
51+
}
52+
2353
@Override
2454
public LookupElement getLookupElement() {
2555
return LookupElementBuilder

language/cypher/src/main/java/com/neueda/jetbrains/plugin/graphdb/language/cypher/documentation/CypherDocumentationProvider.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.intellij.psi.tree.IElementType;
1010
import com.neueda.jetbrains.plugin.graphdb.language.cypher.completion.metadata.CypherMetadataProviderService;
1111
import com.neueda.jetbrains.plugin.graphdb.language.cypher.completion.metadata.elements.CypherProcedureElement;
12+
import com.neueda.jetbrains.plugin.graphdb.language.cypher.completion.metadata.elements.CypherUserFunctionElement;
1213
import com.neueda.jetbrains.plugin.graphdb.language.cypher.documentation.database.CypherDocumentation;
1314
import com.neueda.jetbrains.plugin.graphdb.language.cypher.psi.*;
1415
import com.neueda.jetbrains.plugin.graphdb.language.cypher.util.TraverseUtil;
@@ -61,6 +62,11 @@ public String generateDoc(PsiElement element, @Nullable PsiElement originalEleme
6162
return storedProcedureDocumentation.get();
6263
}
6364

65+
Optional<String> userFunctionDocumentation = userFunctionDocumentation(element);
66+
if (userFunctionDocumentation.isPresent()) {
67+
return userFunctionDocumentation.get();
68+
}
69+
6470
return null;
6571
}
6672

@@ -118,6 +124,16 @@ private Optional<String> storedProcedureDocumentation(PsiElement element) {
118124
return Optional.empty();
119125
}
120126

127+
private Optional<String> userFunctionDocumentation(PsiElement element) {
128+
if (element instanceof CypherFunctionInvocation) {
129+
CypherFunctionInvocation cypherFunctionInvocation = (CypherFunctionInvocation) element;
130+
return getMetadataService(element)
131+
.findUserFunction(cypherFunctionInvocation.getFullName())
132+
.map(CypherUserFunctionElement::getDocumentation);
133+
}
134+
return Optional.empty();
135+
}
136+
121137
private CypherMetadataProviderService getMetadataService(PsiElement element) {
122138
return ServiceManager.getService(element.getProject(), CypherMetadataProviderService.class);
123139
}

testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/tests/cypher/documentation/AutoGeneratedProcedureDocumentationTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public void testExistingProcedureDocumentationWithoutDescription() throws Except
1919
metadata.addProcedure("test.procedureName", "(signature)", null);
2020
configure("CALL test.proce<caret>dureName(42);");
2121
assertThat(verify())
22+
.contains("procedure")
2223
.contains("test.procedureName")
2324
.contains("Arguments")
2425
.contains("(signature)")
@@ -30,6 +31,7 @@ public void testExistingProcedureDocumentationWithDescription() throws Exception
3031
metadata.addProcedure("test.procedureName", "(signature)", "My cool description");
3132
configure("CALL test.proce<caret>dureName(42);");
3233
assertThat(verify())
34+
.contains("procedure")
3335
.contains("test.procedureName")
3436
.contains("Arguments")
3537
.contains("(signature)")
@@ -38,7 +40,7 @@ public void testExistingProcedureDocumentationWithDescription() throws Exception
3840
.contains("My cool description");
3941
}
4042

41-
public void testNonExistingProcudureNoDocumentation() throws Exception {
43+
public void testNonExistingProcedureNoDocumentation() throws Exception {
4244
configure("CALL test.proce<caret>dureName(42);");
4345
verify(null);
4446
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.documentation;
2+
3+
import com.neueda.jetbrains.plugin.graphdb.language.cypher.completion.metadata.CypherMetadataContainer;
4+
import com.neueda.jetbrains.plugin.graphdb.test.integration.neo4j.tests.cypher.util.BaseDocumentationTest;
5+
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
8+
public class AutoGeneratedUserFunctionDocumentationTest extends BaseDocumentationTest {
9+
10+
private CypherMetadataContainer metadata;
11+
12+
@Override
13+
public void setUp() throws Exception {
14+
super.setUp();
15+
metadata = services().cypherMetadataProvider().getContainer("documentationTest");
16+
}
17+
18+
public void testExistingUserFunctionDocumentationWithoutDescription() throws Exception {
19+
metadata.addUserFunction("test.userFunctionName", "(functionSignature)", null);
20+
configure("RETURN test.user<caret>FunctionName(42);");
21+
assertThat(verify())
22+
.contains("function")
23+
.contains("test.userFunctionName")
24+
.contains("Arguments")
25+
.contains("(functionSignature)")
26+
.contains("Return")
27+
.contains("<?>");
28+
}
29+
30+
public void testExistingUserFunctionDocumentationWithDescription() throws Exception {
31+
metadata.addUserFunction("test.userFunctionName", "(functionSignature)", "My cool description");
32+
configure("RETURN test.user<caret>FunctionName(42);");
33+
assertThat(verify())
34+
.contains("function")
35+
.contains("test.userFunctionName")
36+
.contains("Arguments")
37+
.contains("(functionSignature)")
38+
.contains("Return")
39+
.contains("<?>")
40+
.contains("My cool description");
41+
}
42+
43+
public void testNonExistingUserFunctionNoDocumentation() throws Exception {
44+
configure("RETURN test.user<caret>FunctionName(42);");
45+
verify(null);
46+
}
47+
}

testing/integration-neo4j/src/test/java/com/neueda/jetbrains/plugin/graphdb/test/integration/neo4j/util/base/BaseIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void setUp() throws Exception {
3333
// Clean up any data sources & their information
3434
List<DataSourceApi> dataSources = new ArrayList<>(component().dataSources().getDataSourceContainer().getDataSources());
3535
component().dataSources().getDataSourceContainer().removeDataSources(dataSources);
36-
dataSources.forEach(dataSource -> services().cypherMetadataProvider().wipeContainer(dataSource.getName()));
36+
services().cypherMetadataProvider().wipeAll();
3737
}
3838

3939
public Services services() {

0 commit comments

Comments
 (0)