• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Camelcade / Perl5-IDEA / #525521630

14 Jul 2025 06:46AM UTC coverage: 82.353% (+0.05%) from 82.308%
#525521630

push

github

hurricup
#2842 Renamed serialization helper to backend helper

It is better reflect the semantics of the class. It contains backend functionality of the values, like indexes access.

70 of 70 new or added lines in 37 files covered. (100.0%)

2 existing lines in 2 files now uncovered.

30885 of 37503 relevant lines covered (82.35%)

0.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.96
/tt2/backend/src/main/java/com/perl5/lang/tt2/TemplateToolkitFileViewProvider.java
1
/*
2
 * Copyright 2015-2025 Alexandr Evstigneev
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package com.perl5.lang.tt2;
18

19
import com.intellij.lang.Language;
20
import com.intellij.lang.LanguageParserDefinitions;
21
import com.intellij.lang.ParserDefinition;
22
import com.intellij.lang.html.HTMLLanguage;
23
import com.intellij.openapi.project.Project;
24
import com.intellij.openapi.vfs.VirtualFile;
25
import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider;
26
import com.intellij.psi.PsiElement;
27
import com.intellij.psi.PsiFile;
28
import com.intellij.psi.PsiManager;
29
import com.intellij.psi.impl.source.PsiFileImpl;
30
import com.intellij.psi.templateLanguages.ConfigurableTemplateLanguageFileViewProvider;
31
import com.intellij.psi.templateLanguages.OuterLanguageElement;
32
import com.intellij.psi.templateLanguages.TemplateDataLanguageMappings;
33
import com.intellij.testFramework.LightVirtualFile;
34
import com.intellij.util.ReflectionUtil;
35
import com.perl5.lang.perl.PerlLanguage;
36
import com.perl5.lang.tt2.elementTypes.TemplateToolkitElementTypes;
37
import org.jetbrains.annotations.NotNull;
38
import org.jetbrains.annotations.Nullable;
39

40
import java.util.HashSet;
41
import java.util.Set;
42

43

44
public class TemplateToolkitFileViewProvider extends MultiplePsiFilesPerDocumentFileViewProvider
45
  implements ConfigurableTemplateLanguageFileViewProvider {
46
  private final Language myBaseLanguage = TemplateToolkitLanguage.INSTANCE;
1✔
47
  private final Language myTemplateLanguage;
48
  private final Set<Language> myRelevantLanguages = new HashSet<>();
1✔
49

50
  public TemplateToolkitFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile virtualFile, boolean eventSystemEnabled) {
51
    super(manager, virtualFile, eventSystemEnabled);
1✔
52
    myRelevantLanguages.add(getBaseLanguage());
1✔
53
    myRelevantLanguages.add(myTemplateLanguage = calcTemplateLanguage(manager, virtualFile));
1✔
54
  }
1✔
55

56
  @Override
57
  public @NotNull Set<Language> getLanguages() {
58
    return myRelevantLanguages;
1✔
59
  }
60

61
  @Override
62
  public @NotNull Language getBaseLanguage() {
63
    return myBaseLanguage;
1✔
64
  }
65

66
  @Override
67
  protected @NotNull MultiplePsiFilesPerDocumentFileViewProvider cloneInner(@NotNull VirtualFile fileCopy) {
68
    return new TemplateToolkitFileViewProvider(getManager(), fileCopy, false);
1✔
69
  }
70

71
  @Override
72
  public @NotNull Language getTemplateDataLanguage() {
73
    return myTemplateLanguage;
1✔
74
  }
75

76
  @Override
77
  protected @Nullable PsiFile createFile(@NotNull Language lang) {
78
    if (lang == getTemplateDataLanguage()) {
1✔
79
      ParserDefinition parserDefinition = LanguageParserDefinitions.INSTANCE.forLanguage(getTemplateDataLanguage());
1✔
80

81
      if (parserDefinition == null) {
1✔
82
        return null;
×
83
      }
84

85
      final PsiFileImpl file = (PsiFileImpl)parserDefinition.createFile(this);
1✔
86
      file.setContentElementType(TemplateToolkitElementTypes.TT2_TEMPLATE_DATA);
1✔
87
      return file;
1✔
88
    }
89

90
    if (lang == getBaseLanguage()) {
1✔
91
      return LanguageParserDefinitions.INSTANCE.forLanguage(lang).createFile(this);
1✔
92
    }
93
    return null;
×
94
  }
95

96
  @Override
97
  public @Nullable PsiElement findElementAt(int offset, @NotNull Class<? extends Language> lang) {
98
    final PsiFile mainRoot = getPsi(getBaseLanguage());
1✔
99
    PsiElement ret = null;
1✔
100
    for (final Language language : getLanguages()) {
1✔
101
      if (!ReflectionUtil.isAssignable(lang, language.getClass())) {
1✔
102
        continue;
×
103
      }
104
      if (lang.equals(Language.class) && !getLanguages().contains(language)) {
1✔
105
        continue;
×
106
      }
107

108
      final PsiFile psiRoot = getPsi(language);
1✔
109
      final PsiElement psiElement = findElementAt(psiRoot, offset);
1✔
110
      if (psiElement == null || psiElement instanceof OuterLanguageElement) {
1✔
111
        continue;
1✔
112
      }
113
      if (ret == null || psiRoot != mainRoot) {
1✔
114
        ret = psiElement;
1✔
115
        // fixme this hack is to avoid detecting perl code on lexing phase, guess there are more bugs of this kind, so we better do
116
        if (psiElement.getLanguage() == PerlLanguage.INSTANCE) {
1✔
UNCOV
117
          break;
×
118
        }
119
      }
120
    }
1✔
121
    return ret;
1✔
122
  }
123

124
  public static Language calcTemplateLanguage(@Nullable Project project, @Nullable VirtualFile file) {
125
    return calcTemplateLanguage(project == null ? null : PsiManager.getInstance(project), file);
1✔
126
  }
127

128
  public static Language calcTemplateLanguage(@Nullable PsiManager manager, @Nullable VirtualFile file) {
129
    while (file instanceof LightVirtualFile lightVirtualFile) {
1✔
130
      VirtualFile originalFile = lightVirtualFile.getOriginalFile();
1✔
131
      if (originalFile == null || originalFile == file) {
1✔
132
        break;
×
133
      }
134
      file = originalFile;
1✔
135
    }
1✔
136

137
    Language result = manager == null ? null : TemplateDataLanguageMappings.getInstance(manager.getProject()).getMapping(file);
1✔
138
    return result == null ? HTMLLanguage.INSTANCE : result;
1✔
139
  }
140
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc