Skip to content

Commit cdc85bc

Browse files
committed
Added options for the "Check Symbol Version" inspection.
1 parent bd06993 commit cdc85bc

4 files changed

Lines changed: 114 additions & 26 deletions

File tree

resources/de/halirutan/mathematica/MathematicaInspectionBundle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ consistent.compound.expression.in.file.message=Missing semicolon
2828
bugs.implicit.times.through.linebreak.name=Multiplication through linebreak
2929
bugs.implicit.times.through.linebreak.description=This linebreak is interpreted as multiplication. When two complete expressions are separated by a linebreak, then Mathematica interprets this as a multiplication. This is probably not intended.
3030
bugs.implicit.times.through.linebreak.message=Missing comma or semicolon
31-
bugs.unsupported.version.name=Unsupported version for function
32-
bugs.unsupported.version.description=The function or symbol is part of a later version of Mathematica.\nYou language setting indicates that you are writing code for an earlier Mathematica version.
31+
bugs.unsupported.version.name=Function is part of later version
32+
bugs.unsupported.version.description=Reports functions or symbols that are part of a later version of Mathematica than specified. Per default, the language version of the specified Mathematica SDK is used.

src/de/halirutan/mathematica/codeinsight/inspections/bugs/UnsupportedVersion.java

Lines changed: 100 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@
2121

2222
package de.halirutan.mathematica.codeinsight.inspections.bugs;
2323

24+
import com.intellij.codeHighlighting.HighlightDisplayLevel;
2425
import com.intellij.codeInspection.LocalInspectionToolSession;
2526
import com.intellij.codeInspection.ProblemsHolder;
2627
import com.intellij.openapi.projectRoots.Sdk;
2728
import com.intellij.openapi.roots.ProjectRootManager;
29+
import com.intellij.openapi.ui.ComboBox;
30+
import com.intellij.openapi.ui.VerticalFlowLayout;
2831
import com.intellij.openapi.util.TextRange;
2932
import com.intellij.psi.PsiElement;
3033
import com.intellij.psi.PsiElementVisitor;
@@ -40,15 +43,87 @@
4043
import org.jetbrains.annotations.NotNull;
4144
import org.jetbrains.annotations.Nullable;
4245

46+
import javax.swing.*;
47+
import java.awt.event.ActionEvent;
48+
import java.awt.event.ActionListener;
4349
import java.util.HashMap;
4450

4551
/**
46-
* Provides warnings when you are using Mathematica symbols that are introduces later then the version you are using.
52+
* Provides warnings when you are using Mathematica symbols that are introduces later than the version you are using.
4753
*
4854
* @author halirutan
4955
*/
5056
public class UnsupportedVersion extends AbstractInspection {
5157

58+
@SuppressWarnings("InstanceVariableNamingConvention")
59+
public MathematicaLanguageLevel languageLevel = MathematicaLanguageLevel.HIGHEST;
60+
61+
@SuppressWarnings("InstanceVariableNamingConvention")
62+
public boolean useSDKLanguageLevelOrHighest = true;
63+
64+
/**
65+
* Sets the correct text for the info label in the inspection settings page
66+
*
67+
* @param label label to set the text
68+
*/
69+
private void setLabelTextToVersion(JLabel label) {
70+
if (useSDKLanguageLevelOrHighest) {
71+
label.setText("Use language version from Project SDK");
72+
} else {
73+
label.setText(languageLevel.getPresentableText());
74+
}
75+
}
76+
77+
@Nullable
78+
@Override
79+
public JComponent createOptionsPanel() {
80+
final JPanel mainPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP));
81+
final JCheckBox useSDKCheckbox = new JCheckBox("Use Project SDK Language Level");
82+
final JLabel infoLabel = new JLabel();
83+
//noinspection Since15
84+
final ComboBox<MathematicaLanguageLevel> versionComboBox = new ComboBox<MathematicaLanguageLevel>();
85+
86+
for (MathematicaLanguageLevel level : MathematicaLanguageLevel.values()) {
87+
//noinspection unchecked
88+
versionComboBox.addItem(level);
89+
}
90+
versionComboBox.setSelectedItem(languageLevel);
91+
versionComboBox.setEditable(false);
92+
//noinspection unchecked
93+
versionComboBox.addActionListener(new ActionListener() {
94+
@Override
95+
public void actionPerformed(ActionEvent e) {
96+
final MathematicaLanguageLevel selectedItem = (MathematicaLanguageLevel) versionComboBox.getSelectedItem();
97+
if (selectedItem != null) {
98+
languageLevel = selectedItem;
99+
setLabelTextToVersion(infoLabel);
100+
}
101+
}
102+
});
103+
104+
useSDKCheckbox.setSelected(useSDKLanguageLevelOrHighest);
105+
useSDKCheckbox.addActionListener(new ActionListener() {
106+
@Override
107+
public void actionPerformed(ActionEvent e) {
108+
useSDKLanguageLevelOrHighest = useSDKCheckbox.isSelected();
109+
versionComboBox.setVisible(!useSDKLanguageLevelOrHighest);
110+
if (!useSDKLanguageLevelOrHighest) {
111+
languageLevel = (MathematicaLanguageLevel) versionComboBox.getSelectedItem();
112+
}
113+
setLabelTextToVersion(infoLabel);
114+
}
115+
});
116+
117+
setLabelTextToVersion(infoLabel);
118+
versionComboBox.setVisible(!useSDKLanguageLevelOrHighest);
119+
120+
mainPanel.add(infoLabel);
121+
mainPanel.add(useSDKCheckbox);
122+
mainPanel.add(versionComboBox);
123+
124+
return mainPanel;
125+
}
126+
52127
@Nls
53128
@NotNull
54129
@Override
@@ -69,36 +144,50 @@ public String getGroupDisplayName() {
69144
return MathematicaInspectionBundle.message("group.bugs");
70145
}
71146

147+
@NotNull
148+
@Override
149+
public HighlightDisplayLevel getDefaultLevel() {
150+
return HighlightDisplayLevel.ERROR;
151+
}
152+
72153
@NotNull
73154
@Override
74155
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly, @NotNull LocalInspectionToolSession session) {
75-
if(session.getFile().getFileType() instanceof MathematicaFileType) {
76-
return new WrongVersionVisitor(holder);
156+
if (session.getFile().getFileType() instanceof MathematicaFileType) {
157+
if (useSDKLanguageLevelOrHighest) {
158+
final ProjectRootManager manager = ProjectRootManager.getInstance(holder.getProject());
159+
final Sdk projectSdk = manager.getProjectSdk();
160+
if (projectSdk != null && projectSdk.getSdkType() instanceof MathematicaSdkType) {
161+
languageLevel = MathematicaLanguageLevel.createFromSdk(projectSdk);
162+
}
163+
}
164+
return new WrongVersionVisitor(holder, languageLevel);
77165
} else return PsiElementVisitor.EMPTY_VISITOR;
78166
}
79167

80-
81-
168+
/**
169+
* This visitor just inspects all symbols in the file. For each symbol it checks whether it is in the list of built-in
170+
* symbols and if yes, if it is already defined in the Mathematica version the user specified
171+
*/
82172
private static class WrongVersionVisitor extends MathematicaVisitor {
83173

84-
85174
private HashMap<String, Double> mySymbolVersions = SymbolVersionProvider.getSymbolNames();
86175
private MathematicaLanguageLevel myLanguageLevel = MathematicaLanguageLevel.HIGHEST;
87176
private final ProblemsHolder myHolder;
88177

89-
WrongVersionVisitor(final ProblemsHolder holder) {
178+
WrongVersionVisitor(final ProblemsHolder holder, final MathematicaLanguageLevel usedLanguageVersion) {
90179
this.myHolder = holder;
91180
final Sdk projectSdk = ProjectRootManager.getInstance(myHolder.getProject()).getProjectSdk();
92181
if (projectSdk != null && projectSdk.getSdkType() instanceof MathematicaSdkType) {
93-
myLanguageLevel = MathematicaLanguageLevel.createFromSdk(projectSdk);
182+
myLanguageLevel = usedLanguageVersion;
94183
}
95184

96185
}
97186

98187
private void registerProblem(final PsiElement element, final String message) {
99188
myHolder.registerProblem(
100189
element,
101-
TextRange.from(0,element.getTextLength()),
190+
TextRange.from(0, element.getTextLength()),
102191
message);
103192
}
104193

@@ -113,12 +202,11 @@ public void visitSymbol(Symbol symbol) {
113202
if (mySymbolVersions.containsKey(nameWithContext)) {
114203
double version = mySymbolVersions.get(nameWithContext);
115204
if (version > myLanguageLevel.getVersionNumber()) {
116-
registerProblem(symbol, "Mathematica " + version + " required. Your project SDK is " + myLanguageLevel.getPresentableText());
205+
registerProblem(symbol, "Mathematica " + version + " required. You are using " + myLanguageLevel.getPresentableText());
117206
}
118207
}
119-
120-
121208
}
122209
}
123210
}
124211

212+

src/de/halirutan/mathematica/module/MathematicaLanguageLevel.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,13 @@
2020
*/
2121
package de.halirutan.mathematica.module;
2222

23-
import com.intellij.core.JavaCoreBundle;
2423
import com.intellij.openapi.projectRoots.Sdk;
2524
import com.intellij.openapi.roots.LanguageLevelModuleExtension;
2625
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
27-
import com.intellij.openapi.util.Key;
28-
import com.intellij.openapi.util.text.StringUtil;
29-
import com.intellij.util.ArrayUtil;
3026
import de.halirutan.mathematica.MathematicaBundle;
3127
import de.halirutan.mathematica.sdk.MathematicaSdkType;
3228
import org.jetbrains.annotations.Nls;
3329
import org.jetbrains.annotations.NotNull;
34-
import org.jetbrains.annotations.Nullable;
35-
import org.jetbrains.lang.manifest.ManifestBundle;
3630

3731
/**
3832
* @author dsl
@@ -52,7 +46,6 @@ public enum MathematicaLanguageLevel {
5246

5347

5448
public static final MathematicaLanguageLevel HIGHEST = M_11;
55-
public static final Key<MathematicaLanguageLevel> KEY = Key.create("MATHEMATICA_LANGUAGE_LEVEL");
5649

5750
private final String myName;
5851
private final String myPresentableText;
@@ -101,4 +94,10 @@ public boolean isAtLeast(@NotNull MathematicaLanguageLevel level) {
10194
public boolean isLessThan(@NotNull MathematicaLanguageLevel level) {
10295
return compareTo(level) < 0;
10396
}
97+
98+
99+
@Override
100+
public String toString() {
101+
return myPresentableText;
102+
}
104103
}

src/de/halirutan/mathematica/sdk/MathematicaSdkType.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static MathematicaSdkType getInstance() {
6161
* Path to the install directory
6262
* @return Version number in the format e.g. 9.0.1
6363
*/
64-
public static String getMathematicaVersionString(String path) {
64+
private static String getMathematicaVersionString(String path) {
6565
File versionID = new File(path + File.separatorChar + ".VersionID");
6666
String versionString = "Unknown";
6767

@@ -136,20 +136,20 @@ public String suggestSdkName(String currentSdkName, String sdkHome) {
136136
}
137137

138138
@Override
139-
public boolean isRootTypeApplicable(OrderRootType type) {
139+
public boolean isRootTypeApplicable(@NotNull OrderRootType type) {
140140
return type.equals(OrderRootType.SOURCES) || type.equals(OrderRootType.DOCUMENTATION) || type.equals(OrderRootType.CLASSES);
141141
}
142142

143143
@Nullable
144144
@Override
145-
public AdditionalDataConfigurable createAdditionalDataConfigurable(SdkModel sdkModel, SdkModificator sdkModificator) {
145+
public AdditionalDataConfigurable createAdditionalDataConfigurable(@NotNull SdkModel sdkModel, @NotNull SdkModificator sdkModificator) {
146146
return null;
147147
}
148148

149149
@NotNull
150150
@Override
151151
public String getPresentableName() {
152-
return "Mathematica Sdk";
152+
return "Mathematica SDK";
153153
}
154154

155155
@Override
@@ -161,13 +161,14 @@ public Icon getIcon() {
161161
return MathematicaIcons.FILE_ICON;
162162
}
163163

164+
@NotNull
164165
@Override
165166
public Icon getIconForAddAction() {
166167
return MathematicaIcons.FILE_ICON;
167168
}
168169

169170
@Override
170-
public boolean setupSdkPaths(Sdk sdk, SdkModel sdkModel) {
171+
public boolean setupSdkPaths(@NotNull Sdk sdk, @NotNull SdkModel sdkModel) {
171172
final SdkModificator sdkModificator = sdk.getSdkModificator();
172173
final String homePath = sdk.getHomePath();
173174
sdkModificator.setVersionString(getMathematicaVersionString(homePath));

0 commit comments

Comments
 (0)