1
+ # -----------------------------------------------------------------------
2
+ # This file is part of MoonScript
3
+ #
4
+ # MoonSript is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # MoonSript is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with MoonSript. If not, see <https://www.gnu.org/licenses/>.
16
+ #
17
+ # Copyright (C) 2025 Krisna Pranav, MoonScript Developers
18
+ # -----------------------------------------------------------------------
19
+
20
+ module MoonScript
21
+ class TypeChecker
22
+ CSS_PROPERTY_NAMES =
23
+ {{ read_file(" #{ __DIR__ } /../assets/css_properties" ).strip.lines }}
24
+
25
+ def check (node : Ast ::CssDefinition ) : Checkable
26
+ node.value.each do |item |
27
+ type =
28
+ case item
29
+ when Ast ::Node
30
+ resolve item
31
+ else
32
+ STRING
33
+ end
34
+
35
+ unless node.name.starts_with?('-' )
36
+ error! :css_definition_no_property do
37
+ block do
38
+ text " There is no CSS property with the name:"
39
+ bold %( "#{ node.name } ")
40
+ end
41
+
42
+ snippet node
43
+ end unless CSS_PROPERTY_NAMES .includes?(node.name)
44
+ end
45
+
46
+ error! :css_definition_type_mismatch do
47
+ block do
48
+ text " The type of the value for the CSS property"
49
+ bold %( "#{ node.name } ")
50
+ text " is invalid."
51
+ end
52
+
53
+ snippet " expecting one of these types:" , " String\n Number"
54
+ snippet " Instead it is:" , type
55
+ snippet " The css definition in question is here:" , node
56
+ end unless Comparer .matches_any?(type , [STRING , NUMBER ])
57
+ end
58
+
59
+ VOID
60
+ end
61
+ end
62
+ end
0 commit comments