2121
2222package de .halirutan .mathematica .codeinsight .inspections .bugs ;
2323
24+ import com .intellij .codeHighlighting .HighlightDisplayLevel ;
2425import com .intellij .codeInspection .LocalInspectionToolSession ;
2526import com .intellij .codeInspection .ProblemsHolder ;
2627import com .intellij .openapi .projectRoots .Sdk ;
2728import com .intellij .openapi .roots .ProjectRootManager ;
29+ import com .intellij .openapi .ui .ComboBox ;
30+ import com .intellij .openapi .ui .VerticalFlowLayout ;
2831import com .intellij .openapi .util .TextRange ;
2932import com .intellij .psi .PsiElement ;
3033import com .intellij .psi .PsiElementVisitor ;
4043import org .jetbrains .annotations .NotNull ;
4144import org .jetbrains .annotations .Nullable ;
4245
46+ import javax .swing .*;
47+ import java .awt .event .ActionEvent ;
48+ import java .awt .event .ActionListener ;
4349import 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 */
5056public 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+
0 commit comments