Skip to content

Commit 0d9ae8e

Browse files
authored
Merge pull request #88 from apozharski/better-classdef
Fix broken attribute parsing in classdef.
2 parents f12f1af + 7de6a0c commit 0d9ae8e

File tree

2 files changed

+97
-52
lines changed

2 files changed

+97
-52
lines changed

Matlab.tmbundle/Syntaxes/MATLAB.tmLanguage

Lines changed: 91 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -783,49 +783,60 @@
783783
<key>patterns</key>
784784
<array>
785785
<dict>
786+
<key>name</key>
787+
<string>storage.modifier.section.class.matlab</string>
788+
<key>comment</key>
789+
<string>This breaks if there is a line continuation between end of attrs and name, but works for line continuations inside attrs. Line continuations are a mistake.</string>
786790
<key>begin</key>
787-
<string>\G(\([^)]*\))?\s*</string>
788-
<key>beginCaptures</key>
789-
<dict>
790-
<key>1</key>
791+
<string>\G\(</string>
792+
<key>end</key>
793+
<string>\)(?=\s*\w+)</string>
794+
<key>patterns</key>
795+
<array>
791796
<dict>
792-
<key>comment</key>
793-
<string>Optional attributes</string>
794-
<key>patterns</key>
795-
<array>
796-
<dict>
797-
<key>name</key>
798-
<string>punctuation.section.parens.begin.matlab</string>
799-
<key>match</key>
800-
<string>(?&lt;=\s)\(</string>
801-
</dict>
797+
<key>name</key>
798+
<string>punctuation.separator.modifier.comma.matlab</string>
799+
<key>match</key>
800+
<string>,</string>
801+
</dict>
802+
<dict>
803+
<key>name</key>
804+
<string>storage.modifier.class.matlab</string>
805+
<key>match</key>
806+
<string>[a-zA-Z][a-zA-Z0-9_]*</string>
807+
</dict>
808+
<dict>
809+
<key>begin</key>
810+
<string>(=)\s*</string>
811+
<key>beginCaptures</key>
812+
<dict>
813+
<key>1</key>
802814
<dict>
803815
<key>name</key>
804-
<string>punctuation.section.parens.end.matlab</string>
805-
<key>match</key>
806-
<string>\)\z</string>
816+
<string>keyword.operator.assignment.matlab</string>
807817
</dict>
818+
</dict>
819+
<key>end</key>
820+
<string>(?=\)|,)</string>
821+
<key>patterns</key>
822+
<array>
808823
<dict>
809824
<key>name</key>
810-
<string>punctuation.separator.modifier.comma.matlab</string>
825+
<string>constant.language.boolean.matlab</string>
811826
<key>match</key>
812-
<string>,</string>
827+
<string>true|false</string>
813828
</dict>
814829
<dict>
815830
<key>name</key>
816-
<string>storage.modifier.class.matlab</string>
817-
<key>match</key>
818-
<string>[a-zA-Z][a-zA-Z0-9_]*</string>
819-
</dict>
820-
<dict>
831+
<string>meta.metaclass.matlab</string>
821832
<key>begin</key>
822-
<string>(=)\s*</string>
833+
<string>(\?)</string>
823834
<key>beginCaptures</key>
824835
<dict>
825836
<key>1</key>
826837
<dict>
827838
<key>name</key>
828-
<string>keyword.operator.assignment.matlab</string>
839+
<string>keyword.operator.other.question.matlab</string>
829840
</dict>
830841
</dict>
831842
<key>end</key>
@@ -834,46 +845,80 @@
834845
<array>
835846
<dict>
836847
<key>name</key>
837-
<string>constant.language.boolean.matlab</string>
848+
<string>entity.other.class.matlab</string>
838849
<key>match</key>
839-
<string>true|false</string>
850+
<string>(?&lt;=[\s.&lt;])[a-zA-Z][a-zA-Z0-9_]*(?=\s|,|\))</string>
840851
</dict>
841852
<dict>
842-
<key>include</key>
843-
<string>#string</string>
853+
<key>name</key>
854+
<string>entity.name.namespace.matlab</string>
855+
<key>match</key>
856+
<string>[a-zA-Z][a-zA-Z0-9_]*</string>
857+
</dict>
858+
<dict>
859+
<key>name</key>
860+
<string>punctuation.accessor.dot.matlab</string>
861+
<key>match</key>
862+
<string>\.</string>
844863
</dict>
845864
</array>
846865
</dict>
847866
<dict>
848867
<key>include</key>
849-
<string>#comments</string>
868+
<string>#string</string>
869+
</dict>
870+
<dict>
871+
<key>include</key>
872+
<string>#curly_brackets</string>
850873
</dict>
851874
<dict>
852875
<key>include</key>
853876
<string>#line_continuation</string>
854877
</dict>
855878
</array>
856879
</dict>
880+
<dict>
881+
<key>include</key>
882+
<string>#comments</string>
883+
</dict>
884+
<dict>
885+
<key>include</key>
886+
<string>#line_continuation</string>
887+
</dict>
888+
</array>
889+
</dict>
890+
<dict>
891+
<key>begin</key>
892+
<string>\s*(\w+)</string>
893+
<key>beginCaptures</key>
894+
<dict>
895+
<key>1</key>
896+
<dict>
897+
<key>comment</key>
898+
<string>Class name</string>
899+
<key>name</key>
900+
<string>entity.name.type.class.matlab</string>
901+
</dict>
857902
</dict>
903+
<key>end</key>
904+
<string>(?&lt;!\.{3})(?=\s*%|\n)</string>
858905
<key>patterns</key>
859906
<array>
860907
<dict>
861908
<key>begin</key>
862-
<string>\G\s*([a-zA-Z][a-zA-Z0-9_]*)</string>
863-
<key>beginCaptures</key>
864-
<dict>
865-
<key>1</key>
866-
<dict>
867-
<key>comment</key>
868-
<string>Class name</string>
869-
<key>name</key>
870-
<string>entity.name.type.class.matlab</string>
871-
</dict>
872-
</dict>
909+
<string>\G</string>
873910
<key>end</key>
874911
<string>(?&lt;!\.{3})(?=\n)</string>
875912
<key>patterns</key>
876913
<array>
914+
<dict>
915+
<key>include</key>
916+
<string>#comments</string>
917+
</dict>
918+
<dict>
919+
<key>include</key>
920+
<string>#line_continuation</string>
921+
</dict>
877922
<dict>
878923
<key>comment</key>
879924
<string>Optional inheritance operator</string>
@@ -921,14 +966,6 @@
921966
<key>match</key>
922967
<string>&amp;</string>
923968
</dict>
924-
<dict>
925-
<key>include</key>
926-
<string>#comments</string>
927-
</dict>
928-
<dict>
929-
<key>include</key>
930-
<string>#line_continuation</string>
931-
</dict>
932969
</array>
933970
</dict>
934971
<dict>
@@ -940,8 +977,10 @@
940977
<string>#line_continuation</string>
941978
</dict>
942979
</array>
943-
<key>end</key>
944-
<string>(?&lt;!\.{3})(?=\s*%|\n)</string>
980+
</dict>
981+
<dict>
982+
<key>include</key>
983+
<string>#comments</string>
945984
</dict>
946985
</array>
947986
</dict>

test/t87ClassAttributes.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
% SYNTAX TEST "source.matlab" "Property validation: https://github.com/mathworks/MATLAB-Language-grammar/issues/87"
2+
classdef (AllowedSubclasses = {?SubClass1,?SubClass2}) SuperClass
3+
% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ storage.modifier.section.class.matlab
4+
% ^^^^^^^^^^^^^^^^^^^^^ meta.cell.literal.matlab
5+
% ^^^^^^^^^^ entity.name.type.class.matlab
6+
end

0 commit comments

Comments
 (0)