Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Intial support for vsCodeTagSnippets #589

Merged
merged 4 commits into from
Feb 26, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions src/main/java/com/hubspot/jinjava/doc/JinjavaDocFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.hubspot.jinjava.doc.annotations.JinjavaMetaValue;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.doc.annotations.JinjavaVSCodeSnippet;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if this should be VSCode specific. This syntax is technically borrowed from Textmate and other editors use a similar format so I think this could be used across other editors pretty easily

import com.hubspot.jinjava.lib.exptest.ExpTest;
import com.hubspot.jinjava.lib.filter.Filter;
import com.hubspot.jinjava.lib.fn.ELFunctionDefinition;
Expand Down Expand Up @@ -43,6 +44,18 @@ public JinjavaDoc get() {
return doc;
}

public String getVSCodeTagSnippets() {
StringBuffer snippets = new StringBuffer();
for (Tag tag : jinjava.getGlobalContextCopy().getAllTags()) {
if (tag instanceof EndTag) {
continue;
}
snippets.append(getTagSnippet(tag));
snippets.append("\n\n");
}
return snippets.toString();
}

private void addExpTests(JinjavaDoc doc) {
for (ExpTest t : jinjava.getGlobalContextCopy().getAllExpTests()) {
com.hubspot.jinjava.doc.annotations.JinjavaDoc docAnnotation = getJinjavaDocAnnotation(
Expand Down Expand Up @@ -279,4 +292,36 @@ private com.hubspot.jinjava.doc.annotations.JinjavaDoc getJinjavaDocAnnotation(

return clazz.getAnnotation(com.hubspot.jinjava.doc.annotations.JinjavaDoc.class);
}

private String getTagSnippet(Tag tag) {
JinjavaVSCodeSnippet annotation = tag
.getClass()
.getAnnotation(JinjavaVSCodeSnippet.class);
if (annotation != null) {
return annotation.code();
}
com.hubspot.jinjava.doc.annotations.JinjavaDoc docAnnotation = getJinjavaDocAnnotation(
tag.getClass()
);
StringBuilder snippet = new StringBuilder("{% ");
snippet.append(tag.getName());
int i = 1;
for (JinjavaParam param : docAnnotation.input()) {
snippet.append(" ${" + i + ":" + param.value() + "}");
i++;
}

for (JinjavaParam param : docAnnotation.params()) {
snippet.append(" ${" + i + ":" + param.value() + "}");
i++;
}

snippet.append(" %}");

if (tag.getEndTagName() != null) {
snippet.append("\n{% " + tag.getEndTagName() + " %}");
}

return snippet.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.hubspot.jinjava.doc.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface JinjavaVSCodeSnippet {
String desc() default "";

String code();

String output() default "";
}
13 changes: 12 additions & 1 deletion src/main/java/com/hubspot/jinjava/lib/tag/ElseIfTag.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package com.hubspot.jinjava.lib.tag;

import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.tree.TagNode;

@JinjavaDoc(value = "", hidden = true)
@JinjavaDoc(
value = "",
params = {
@JinjavaParam(
value = "condition",
type = "conditional expression",
desc = "An expression that evaluates to either true or false"
)
},
hidden = true
)
public class ElseIfTag implements Tag {
public static final String TAG_NAME = "elif";

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/hubspot/jinjava/lib/tag/IfTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.hubspot.jinjava.lib.tag;

import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.interpret.OutputTooBigException;
Expand All @@ -30,6 +31,13 @@

@JinjavaDoc(
value = "Outputs inner content if expression evaluates to true, otherwise evaluates any elif blocks, finally outputting content of any else block present",
params = {
@JinjavaParam(
value = "condition",
type = "conditional expression",
desc = "An expression that evaluates to either true or false"
)
},
snippets = {
@JinjavaSnippet(
code = "{% if condition %}\n" +
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/hubspot/jinjava/lib/tag/SetTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
import com.hubspot.jinjava.doc.annotations.JinjavaVSCodeSnippet;
import com.hubspot.jinjava.interpret.DeferredValue;
import com.hubspot.jinjava.interpret.DeferredValueException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
Expand Down Expand Up @@ -63,6 +64,7 @@
)
}
)
@JinjavaVSCodeSnippet(code = "{% set ${1:var} = ${2:expr} %}")
public class SetTag implements Tag {
public static final String TAG_NAME = "set";

Expand Down