Skip to content

Commit 6de4f5a

Browse files
committed
Use LangMap to customize Ctags from -A,--analyzer
1 parent 973cf38 commit 6de4f5a

File tree

3 files changed

+62
-22
lines changed

3 files changed

+62
-22
lines changed

opengrok-indexer/src/main/java/org/opengrok/indexer/analysis/AnalyzerGuru.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ public class AnalyzerGuru {
240240
*/
241241
private static final Map<String, Long> ANALYZER_VERSIONS = new HashMap<>();
242242

243+
private static final LangTreeMap langMap = new LangTreeMap();
244+
243245
/*
244246
* If you write your own analyzer please register it here. The order is
245247
* important for any factory that uses a FileAnalyzerFactory.Matcher
@@ -431,8 +433,10 @@ public static void addPrefix(String prefix, AnalyzerFactory factory) {
431433
AnalyzerFactory oldFactory;
432434
if (factory == null) {
433435
oldFactory = pre.remove(prefix);
436+
langMap.exclude(prefix);
434437
} else {
435438
oldFactory = pre.put(prefix, factory);
439+
langMap.add(prefix, factory.getAnalyzer().getCtagsLang());
436440
}
437441

438442
if (factoriesDifferent(factory, oldFactory)) {
@@ -448,21 +452,39 @@ public static void addPrefix(String prefix, AnalyzerFactory factory) {
448452
* @param factory a factory which creates the analyzer to use for the given
449453
* extension (if you pass null as the analyzer, you will disable the
450454
* analyzer used for that extension)
455+
* @throws IllegalArgumentException if {@code extension} contains a period
451456
*/
452-
public static void addExtension(String extension,
453-
AnalyzerFactory factory) {
457+
public static void addExtension(String extension, AnalyzerFactory factory) {
458+
if (extension.contains(".")) {
459+
throw new IllegalArgumentException("extension contains a '.'");
460+
}
461+
462+
// LangMap fileSpec requires a leading period to indicate an extension.
463+
String langMapExtension = "." + extension;
464+
454465
AnalyzerFactory oldFactory;
455466
if (factory == null) {
456467
oldFactory = ext.remove(extension);
468+
langMap.exclude(langMapExtension);
457469
} else {
458470
oldFactory = ext.put(extension, factory);
471+
langMap.add(langMapExtension, factory.getAnalyzer().getCtagsLang());
459472
}
460473

461474
if (factoriesDifferent(factory, oldFactory)) {
462475
addCustomizationKey("e:" + extension);
463476
}
464477
}
465478

479+
/**
480+
* Gets an unmodifiable view of the language mappings resulting from
481+
* {@link #addExtension(String, AnalyzerFactory)} and
482+
* {@link #addPrefix(String, AnalyzerFactory)}.
483+
*/
484+
public static LangMap getLangMap() {
485+
return langMap.unmodifiable();
486+
}
487+
466488
/**
467489
* Get the default Analyzer.
468490
*

opengrok-indexer/src/main/java/org/opengrok/indexer/analysis/Ctags.java

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class Ctags implements Resettable {
5959
private static final Logger LOGGER = LoggerFactory.getLogger(Ctags.class);
6060

6161
private volatile boolean closing;
62+
private final LangTreeMap defaultLangMap = new LangTreeMap();
63+
private LangMap langMap;
6264
private Process ctags;
6365
private OutputStreamWriter ctagsIn;
6466
private BufferedReader ctagsOut;
@@ -88,6 +90,10 @@ public void setBinary(String binary) {
8890
this.binary = binary;
8991
}
9092

93+
public void setLangMap(LangMap langMap) {
94+
this.langMap = langMap;
95+
}
96+
9197
public int getTabSize() {
9298
return tabSize;
9399
}
@@ -152,13 +158,15 @@ private void initialize() throws IOException {
152158
command.add("--filter-terminator=" + CTAGS_FILTER_TERMINATOR + "\n");
153159
command.add("--fields=-anf+iKnS");
154160
command.add("--excmd=pattern");
155-
command.add("--langmap=sh:+.kshlib"); // RFE #17849
156-
command.add("--langmap=sql:+.plb"); // RFE #19208
157-
command.add("--langmap=sql:+.pls"); // RFE #19208
158-
command.add("--langmap=sql:+.pld"); // RFE #19208
159-
command.add("--langmap=sql:+.pks"); // RFE #19208 ?
160-
command.add("--langmap=sql:+.pkb"); // # 1763
161-
command.add("--langmap=sql:+.pck"); // # 1763
161+
162+
defaultLangMap.clear();
163+
defaultLangMap.add(".KSHLIB", "sh"); // RFE #17849. Upper-case file spec
164+
defaultLangMap.add(".PLB", "sql"); // RFE #19208. Upper-case file spec
165+
defaultLangMap.add(".PLS", "sql"); // RFE #19208. Upper-case file spec
166+
defaultLangMap.add(".PLD", "sql"); // RFE #19208. Upper-case file spec
167+
defaultLangMap.add(".PKS", "sql"); // RFE #19208 ? Upper-case file spec
168+
defaultLangMap.add(".PKB", "sql"); // # 1763. Upper-case file spec
169+
defaultLangMap.add(".PCK", "sql"); // # 1763. Upper-case file spec
162170

163171
//Ideally all below should be in ctags, or in outside config file,
164172
//we might run out of command line SOON
@@ -185,6 +193,12 @@ private void initialize() throws IOException {
185193

186194
//PLEASE add new languages ONLY with POSIX syntax (see above wiki link)
187195

196+
if (langMap != null) {
197+
command.addAll(langMap.mergeSecondary(defaultLangMap).getCtagsArgs());
198+
} else {
199+
command.addAll(defaultLangMap.getCtagsArgs());
200+
}
201+
188202
/* Add extra command line options for ctags. */
189203
if (CTagsExtraOptionsFile != null) {
190204
LOGGER.log(Level.INFO, "Adding extra options to ctags");
@@ -229,7 +243,7 @@ private void initialize() throws IOException {
229243

230244
private void addRustSupport(List<String> command) {
231245
command.add("--langdef=rust");
232-
command.add("--langmap=rust:+.rs");
246+
defaultLangMap.add(".RS", "rust"); // Upper-case file spec
233247

234248
// The following are not supported yet in Universal Ctags b13cb551
235249
command.add("--regex-rust=/^[[:space:]]*(pub[[:space:]]+)?(static|const)[[:space:]]+(mut[[:space:]]+)?" +
@@ -243,7 +257,8 @@ private void addRustSupport(List<String> command) {
243257

244258
private void addPowerShellSupport(List<String> command) {
245259
command.add("--langdef=powershell");
246-
command.add("--langmap=powershell:+.ps1,powershell:+.psm1");
260+
defaultLangMap.add(".PS1", "powershell"); // Upper-case file spec
261+
defaultLangMap.add(".PSM1", "powershell"); // Upper-case file spec
247262
command.add("--regex-powershell=/\\$(\\{[^}]+\\})/\\1/v,variable/");
248263
command.add("--regex-powershell=/\\$([[:alnum:]_]+([:.][[:alnum:]_]+)*)/\\1/v,variable/");
249264
command.add("--regex-powershell=/^[[:space:]]*(:[^[:space:]]+)/\\1/l,label/");
@@ -261,7 +276,7 @@ private void addPowerShellSupport(List<String> command) {
261276

262277
private void addPascalSupport(List<String> command) {
263278
command.add("--langdef=pascal");
264-
command.add("--langmap=pascal:+.pas");
279+
defaultLangMap.add(".PAS", "pascal"); // Upper-case file spec
265280
command.add("--regex-pascal=/([[:alnum:]_]+)[[:space:]]*=[[:space:]]*\\([[:space:]]*[[:alnum:]_][[:space:]]*\\)/\\1/t,Type/");
266281
command.add("--regex-pascal=/([[:alnum:]_]+)[[:space:]]*=[[:space:]]*class[[:space:]]*[^;]*$/\\1/c,Class/");
267282
command.add("--regex-pascal=/([[:alnum:]_]+)[[:space:]]*=[[:space:]]*interface[[:space:]]*[^;]*$/\\1/i,interface/");
@@ -276,7 +291,7 @@ private void addPascalSupport(List<String> command) {
276291

277292
private void addSwiftSupport(List<String> command) {
278293
command.add("--langdef=swift");
279-
command.add("--langmap=swift:+.swift");
294+
defaultLangMap.add(".SWIFT", "swift"); // Upper-case file spec
280295
command.add("--regex-swift=/enum[[:space:]]+([^\\{\\}]+).*$/\\1/n,enum,enums/");
281296
command.add("--regex-swift=/typealias[[:space:]]+([^:=]+).*$/\\1/t,typealias,typealiases/");
282297
command.add("--regex-swift=/protocol[[:space:]]+([^:\\{]+).*$/\\1/p,protocol,protocols/");
@@ -289,8 +304,8 @@ private void addSwiftSupport(List<String> command) {
289304

290305
private void addKotlinSupport(List<String> command) {
291306
command.add("--langdef=kotlin");
292-
command.add("--langmap=kotlin:+.kt");
293-
command.add("--langmap=kotlin:+.kts");
307+
defaultLangMap.add(".KT", "kotlin"); // Upper-case file spec
308+
defaultLangMap.add(".KTS", "kotlin"); // Upper-case file spec
294309
command.add("--regex-kotlin=/^[[:space:]]*((abstract|final|sealed|implicit|lazy)[[:space:]]*)*" +
295310
"(private[^ ]*|protected)?[[:space:]]*class[[:space:]]+([[:alnum:]_:]+)/\\4/c,classes/");
296311
command.add("--regex-kotlin=/^[[:space:]]*((abstract|final|sealed|implicit|lazy)[[:space:]]*)*" +
@@ -313,9 +328,9 @@ private void addKotlinSupport(List<String> command) {
313328

314329
private void addClojureSupport(List<String> command) {
315330
command.add("--langdef=clojure"); // clojure support (patterns are from https://gist.github.com/kul/8704283)
316-
command.add("--langmap=clojure:+.clj");
317-
command.add("--langmap=clojure:+.cljs");
318-
command.add("--langmap=clojure:+.cljx");
331+
defaultLangMap.add(".CLJ", "clojure"); // Upper-case file spec
332+
defaultLangMap.add(".CLJS", "clojure"); // Upper-case file spec
333+
defaultLangMap.add(".CLJX", "clojure"); // Upper-case file spec
319334

320335
command.add("--regex-clojure=/\\([[:space:]]*create-ns[[:space:]]+([-[:alnum:]*+!_:\\/.?]+)/\\1/n,namespace/");
321336
command.add("--regex-clojure=/\\([[:space:]]*def[[:space:]]+([-[:alnum:]*+!_:\\/.?]+)/\\1/d,definition/");
@@ -331,8 +346,8 @@ private void addClojureSupport(List<String> command) {
331346

332347
private void addHaskellSupport(List<String> command) {
333348
command.add("--langdef=haskell"); // below was added with #912
334-
command.add("--langmap=haskell:+.hs");
335-
command.add("--langmap=haskell:+.hsc");
349+
defaultLangMap.add(".HS", "haskell"); // Upper-case file spec
350+
defaultLangMap.add(".HSC", "haskell"); // Upper-case file spec
336351
command.add("--regex-haskell=/^[[:space:]]*class[[:space:]]+([a-zA-Z0-9_]+)/\\1/c,classes/");
337352
command.add("--regex-haskell=/^[[:space:]]*data[[:space:]]+([a-zA-Z0-9_]+)/\\1/t,types/");
338353
command.add("--regex-haskell=/^[[:space:]]*newtype[[:space:]]+([a-zA-Z0-9_]+)/\\1/t,types/");
@@ -345,7 +360,7 @@ private void addHaskellSupport(List<String> command) {
345360

346361
private void addScalaSupport(List<String> command) {
347362
command.add("--langdef=scala"); // below is bug 61 to get full scala support
348-
command.add("--langmap=scala:+.scala");
363+
defaultLangMap.add(".SCALA", "scala"); // Upper-case file spec
349364
command.add("--regex-scala=/^[[:space:]]*((abstract|final|sealed|implicit|lazy)[[:space:]]*)*" +
350365
"(private|protected)?[[:space:]]*class[[:space:]]+([a-zA-Z0-9_]+)/\\4/c,classes/");
351366
command.add("--regex-scala=/^[[:space:]]*((abstract|final|sealed|implicit|lazy)[[:space:]]*)*" +

opengrok-indexer/src/main/java/org/opengrok/indexer/index/IndexerParallelizer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919

2020
/*
21-
* Copyright (c) 2017-2018, Chris Fraire <[email protected]>.
21+
* Copyright (c) 2017-2019, Chris Fraire <[email protected]>.
2222
*/
2323

2424
package org.opengrok.indexer.index;
@@ -28,6 +28,8 @@
2828
import java.util.concurrent.ForkJoinPool;
2929
import java.util.concurrent.ScheduledThreadPoolExecutor;
3030
import java.util.logging.Logger;
31+
32+
import org.opengrok.indexer.analysis.AnalyzerGuru;
3133
import org.opengrok.indexer.analysis.Ctags;
3234
import org.opengrok.indexer.analysis.CtagsValidator;
3335
import org.opengrok.indexer.configuration.RuntimeEnvironment;
@@ -268,6 +270,7 @@ private static Ctags getNewCtags(RuntimeEnvironment env) {
268270
" searching definitions will not work!");
269271
} else {
270272
ctags.setBinary(ctagsBinary);
273+
ctags.setLangMap(AnalyzerGuru.getLangMap());
271274

272275
String filename = env.getCTagsExtraOptionsFile();
273276
if (filename != null) {

0 commit comments

Comments
 (0)