Skip to content

Commit f4fecb1

Browse files
authored
Merge pull request #217 from shuzijun/gradle
Added support for multiple submission ranges. close #209 Optimization range tips.
2 parents 138b3a9 + 5eca0d5 commit f4fecb1

File tree

4 files changed

+115
-12
lines changed

4 files changed

+115
-12
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.shuzijun.leetcode.plugin.language;
2+
3+
import com.intellij.lang.ASTNode;
4+
import com.intellij.lang.folding.FoldingBuilderEx;
5+
import com.intellij.lang.folding.FoldingDescriptor;
6+
import com.intellij.openapi.editor.Document;
7+
import com.intellij.openapi.editor.FoldingGroup;
8+
import com.intellij.openapi.project.DumbAware;
9+
import com.intellij.openapi.util.TextRange;
10+
import com.intellij.psi.PsiComment;
11+
import com.intellij.psi.PsiElement;
12+
import com.intellij.psi.util.PsiTreeUtil;
13+
import com.shuzijun.leetcode.plugin.model.Constant;
14+
import org.jetbrains.annotations.NotNull;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
import java.util.ArrayList;
18+
import java.util.Collection;
19+
import java.util.List;
20+
21+
/**
22+
* @author shuzijun
23+
*/
24+
public class ScopeFoldingBuilder extends FoldingBuilderEx implements DumbAware {
25+
@Override
26+
public @NotNull FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean b) {
27+
FoldingGroup group = FoldingGroup.newGroup("leetcode editor scope");
28+
List<FoldingDescriptor> descriptors = new ArrayList<>();
29+
// Get a collection of the literal expressions in the document below root
30+
Collection<PsiComment> psiComments =
31+
PsiTreeUtil.findChildrenOfType(root, PsiComment.class);
32+
// Evaluate the collection
33+
for (final PsiComment psiComment : psiComments) {
34+
String value = psiComment.getText();
35+
if (value != null && (value.contains(Constant.SUBMIT_REGION_BEGIN) || value.contains(Constant.SUBMIT_REGION_END))) {
36+
// Add a folding descriptor for the literal expression at this node.
37+
descriptors.add(new FoldingDescriptor(psiComment.getNode(),
38+
new TextRange(psiComment.getTextRange().getStartOffset(),
39+
psiComment.getTextRange().getEndOffset()),
40+
group));
41+
}
42+
}
43+
return descriptors.toArray(new FoldingDescriptor[descriptors.size()]);
44+
}
45+
46+
47+
@Override
48+
public @Nullable String getPlaceholderText(@NotNull ASTNode astNode) {
49+
String retTxt = "----";
50+
if (astNode.getPsi() instanceof PsiComment) {
51+
PsiComment psiComment = (PsiComment) astNode.getPsi();
52+
String value = psiComment.getText();
53+
if (value != null) {
54+
if (value.contains(Constant.SUBMIT_REGION_BEGIN)) {
55+
retTxt = "--BEGIN--";
56+
} else if (value.contains(Constant.SUBMIT_REGION_END)) {
57+
retTxt = "--END--";
58+
}
59+
}
60+
}
61+
return retTxt;
62+
}
63+
64+
@Override
65+
public boolean isCollapsedByDefault(@NotNull ASTNode astNode) {
66+
return true;
67+
}
68+
}

src/main/java/com/shuzijun/leetcode/plugin/utils/FileUtils.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.apache.commons.lang.StringUtils;
2222

2323
import java.io.*;
24+
import java.util.ArrayList;
2425
import java.util.LinkedList;
2526
import java.util.List;
2627
import java.util.concurrent.atomic.AtomicReference;
@@ -123,23 +124,25 @@ public Boolean compute() throws Throwable {
123124
if (StringUtils.isNotBlank(body)) {
124125

125126
List<String> codeList = new LinkedList<>();
126-
int codeBegin = -1;
127-
int codeEnd = -1;
128-
int lineCount = 0;
127+
List<Integer> codeBegins = new ArrayList<>();
128+
List<Integer> codeEnds = new ArrayList<>();
129+
Integer lineCount = 0;
129130

130131
String[] lines = body.split("\r\n|\r|\n");
131132
for (String line : lines) {
132133
if (StringUtils.isNotBlank(line) && trim(line).equals(trim(codeTypeEnum.getComment() + Constant.SUBMIT_REGION_BEGIN))) {
133-
codeBegin = lineCount;
134+
codeBegins.add(lineCount);
134135
} else if (StringUtils.isNotBlank(line) && trim(line).equals(trim(codeTypeEnum.getComment() + Constant.SUBMIT_REGION_END))) {
135-
codeEnd = lineCount;
136+
codeEnds.add(lineCount);
136137
}
137138
codeList.add(line);
138139
lineCount++;
139140
}
140-
if (codeBegin >= 0 && codeEnd > 0 && codeBegin < codeEnd) {
141-
for (int i = codeBegin + 1; i < codeEnd; i++) {
142-
code.append(codeList.get(i)).append("\n");
141+
if (codeBegins.size() == codeBegins.size() && codeBegins.size() > 0) {
142+
for (int s = 0; s < codeBegins.size(); s++) {
143+
for (int i = codeBegins.get(s) + 1; i < codeEnds.get(s); i++) {
144+
code.append(codeList.get(i)).append("\n");
145+
}
143146
}
144147
} else {
145148
Boolean isCode = Boolean.FALSE;
@@ -252,16 +255,16 @@ private static void doCopyFile(File srcFile, File destFile, boolean preserveFile
252255
}
253256
}
254257

255-
public static void openFileEditor(File file, Project project){
256-
ApplicationManager.getApplication().invokeAndWait(()->{
258+
public static void openFileEditor(File file, Project project) {
259+
ApplicationManager.getApplication().invokeAndWait(() -> {
257260
VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
258261
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, vf);
259262
FileEditorManager.getInstance(project).openTextEditor(descriptor, false);
260263
});
261264
}
262265

263-
public static void openFileEditorAndSaveState(File file, Project project, Question question){
264-
ApplicationManager.getApplication().invokeAndWait(()->{
266+
public static void openFileEditorAndSaveState(File file, Project project, Question question) {
267+
ApplicationManager.getApplication().invokeAndWait(() -> {
265268
VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file);
266269
OpenFileDescriptor descriptor = new OpenFileDescriptor(project, vf);
267270
FileEditorManager.getInstance(project).openTextEditor(descriptor, false);

src/main/java/com/shuzijun/leetcode/plugin/utils/VelocityTool.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.shuzijun.leetcode.plugin.utils;
22

3+
import com.shuzijun.leetcode.plugin.model.CodeTypeEnum;
4+
import com.shuzijun.leetcode.plugin.model.Config;
5+
import com.shuzijun.leetcode.plugin.model.Constant;
6+
import com.shuzijun.leetcode.plugin.setting.PersistentConfig;
37
import org.apache.commons.lang3.StringUtils;
48
import org.apache.commons.lang3.time.DateFormatUtils;
59

@@ -88,4 +92,17 @@ public static String date(String format) {
8892
return DateFormatUtils.format(new Date(), format);
8993
}
9094

95+
public static String SUBMIT_REGION_BEGIN(){
96+
Config config = PersistentConfig.getInstance().getInitConfig();
97+
String codeType = config.getCodeType();
98+
CodeTypeEnum codeTypeEnum = CodeTypeEnum.getCodeTypeEnum(codeType);
99+
return codeTypeEnum.getComment() + Constant.SUBMIT_REGION_BEGIN;
100+
}
101+
102+
public static String SUBMIT_REGION_END(){
103+
Config config = PersistentConfig.getInstance().getInitConfig();
104+
String codeType = config.getCodeType();
105+
CodeTypeEnum codeTypeEnum = CodeTypeEnum.getCodeTypeEnum(codeType);
106+
return codeTypeEnum.getComment() + Constant.SUBMIT_REGION_END;
107+
}
91108
}

src/main/resources/META-INF/plugin.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,21 @@
381381
<applicationConfigurable groupId="tools" displayName="leetcode plugin" id="leetcode.id"
382382
instance="com.shuzijun.leetcode.plugin.setting.SettingConfigurable"/>
383383
<statusBarWidgetProvider implementation="com.shuzijun.leetcode.plugin.timer.TimerStatusBarWidgetProvider"/>
384+
<lang.foldingBuilder language="JAVA" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
385+
<lang.foldingBuilder language="Python" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
386+
<lang.foldingBuilder language="ObjectiveC" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
387+
<lang.foldingBuilder language="CS" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
388+
<lang.foldingBuilder language="ECMAScript 6" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
389+
<lang.foldingBuilder language="ruby" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
390+
<lang.foldingBuilder language="Swift" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
391+
<lang.foldingBuilder language="go" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
392+
<lang.foldingBuilder language="Scala" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
393+
<lang.foldingBuilder language="kotlin" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
394+
<lang.foldingBuilder language="Renderscript" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
395+
<lang.foldingBuilder language="PHP" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
396+
<lang.foldingBuilder language="Shell Script" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
397+
<lang.foldingBuilder language="GenericSQL" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
398+
<lang.foldingBuilder language="TypeScript" implementationClass="com.shuzijun.leetcode.plugin.language.ScopeFoldingBuilder"/>
384399
</extensions>
385400

386401
<actions>

0 commit comments

Comments
 (0)