Skip to content

Commit 885475d

Browse files
BillWagnerCopilot
andcommitted
Fix ANTLR grammar validator tests for pattern-matching enhancements
Update grammar test infrastructure to match new pattern rule hierarchy: - pattern : logical_pattern (was 6 direct alternatives) - New rules: primary_pattern, parenthesized_pattern, type_pattern, relational_pattern, logical_pattern, disjunctive_pattern, conjunctive_pattern, negated_pattern Changes: - GrammarTestingEnv.tgz: Updated baseline grammar and Rules modification set to handle new pattern hierarchy. TypePatternPredicate now walks up the tree through intermediate pattern nodes to find relational_expression. - Reference tree files: 'is (type' -> 'is (pattern' since ReplacePatternWithType action is no longer needed (type_pattern is now a proper grammar rule). - RightShift stderr: Added 'and', 'not', 'or' to expected token sets (new pattern operator keywords). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 38a7ae5 commit 885475d

7 files changed

Lines changed: 337 additions & 8 deletions

File tree

-1.48 KB
Binary file not shown.

tools/GrammarTesting/SetupAndTest

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
#!/bin/bash
2+
3+
# Setup environment and then do checks, must pass in Standard source directory
4+
5+
# Where are we?
6+
7+
ScriptPath=$(realpath "${BASH_SOURCE[0]}")
8+
ScriptDir=$(dirname "$ScriptPath")
9+
10+
_usageDescription ()
11+
{
12+
cat <<USAGE
13+
Usage: SetupAndTest sourceDirectory [options]
14+
15+
Where:
16+
sourceDirectory
17+
The directory of the Standard source (.md) files
18+
from which to extract the grammar.
19+
20+
With no options checks grammar and then performs parsing tests.
21+
22+
Options:
23+
-g, --grammar
24+
Perform grammar checks
25+
-p, --parsing
26+
Perform parsing tests
27+
-d, --demo-parsing
28+
Perform demo parsing tests
29+
-h, -?, --help
30+
Displays this help and exits
31+
-v, --verbose
32+
Be (more) verbose
33+
-q, --quiet
34+
Reduce messages
35+
-wd, --working-directory
36+
Directory to store intermediate generated files in: Java source code,
37+
Java .class files, etc. Directory path follows option separated by
38+
space or an equals sign (e.g. -wd path or -wd=path)
39+
-e, --environment-directory
40+
Directory containing environment – for requirements see documentation.
41+
If omitted the working directory and directory containing this command
42+
will be searched.
43+
-t, --tests-directory
44+
Directory containing tests – for requirements see documentation.
45+
If omitted the working directory and directory containing this command
46+
will be searched.
47+
USAGE
48+
}
49+
50+
# define usage(), we can’t use the version from our common.bash
51+
# library as its location is not yet known
52+
53+
usage() # [optErrorMsg [optExitCode]]
54+
{
55+
# name the parameters
56+
local _optErrorMsg="$1"
57+
local _optExitCode="${2:--1}" # default to -1
58+
59+
# if optErrorMsg exists send all output to stderr
60+
if [ "$_optErrorMsg" != "" ]; then
61+
echo "Error: $_optErrorMsg" 1>&2
62+
echo 1>&2
63+
_usageDescription 1>&2
64+
echo 1>&2
65+
exit $_optExitCode
66+
else
67+
echo
68+
_usageDescription
69+
echo
70+
fi
71+
}
72+
73+
# scan all args
74+
75+
doGrammar=false
76+
doParsing=false
77+
argSourceDirectory=
78+
optWorkingDirectory=
79+
optEnvPath=
80+
optTestPath=
81+
82+
declare -a doChecksArgs
83+
84+
requireArgument=
85+
86+
for i in "$@"; do
87+
if [[ "$requireArgument" == "" ]]; then
88+
case "$i" in
89+
-g|--grammar)
90+
doChecksArgs+=($i)
91+
;;
92+
-p|--parsing)
93+
doChecksArgs+=($i)
94+
;;
95+
-d|--demo-parsing)
96+
doChecksArgs+=($i)
97+
;;
98+
-h|--help|-\?)
99+
usage
100+
exit
101+
;;
102+
-v|--verbose)
103+
beVerbose=true # so we can take note of this parameter ourselves
104+
doChecksArgs+=($i)
105+
;;
106+
-q|--quiet)
107+
beQuiet=true # so we can take note of this parameter ourselves
108+
doChecksArgs+=($i)
109+
;;
110+
-dbg)
111+
doChecksArgs+=($i)
112+
;;
113+
-wd|--working-directory)
114+
if [[ "$optWorkingDirectory" == "" ]]; then
115+
requireArgument=$i
116+
else
117+
usage "Unexpected option $i"
118+
fi
119+
;;
120+
-wd=*|--working-directory=*)
121+
if [[ "$optWorkingDirectory" == "" ]]; then
122+
optWorkingDirectory="${i#*=}"
123+
else
124+
usage "Unexpected option $i"
125+
fi
126+
;;
127+
-e|--environment-directory)
128+
if [[ "$optEnvPath" == "" ]]; then
129+
requireArgument=$i
130+
else
131+
usage "Unexpected option $i"
132+
fi
133+
;;
134+
-e=*|--environment-directory=*)
135+
if [[ "$optEnvPath" == "" ]]; then
136+
optEnvPath="${i#*=}"
137+
else
138+
usage "Unexpected option $i"
139+
fi
140+
;;
141+
-t|--tests-directory)
142+
if [[ "$optTestPath" == "" ]]; then
143+
requireArgument=$i
144+
else
145+
usage "Unexpected option $i"
146+
fi
147+
;;
148+
-t=*|--tests-directory=*)
149+
if [[ "$optTestPath" == "" ]]; then
150+
optTestPath="${i#*=}"
151+
else
152+
usage "Unexpected option $i"
153+
fi
154+
;;
155+
-*)
156+
usage "Unrecognised option $i"
157+
;;
158+
*)
159+
if [[ "$argSourceDirectory" == "" ]]; then
160+
argSourceDirectory="$i"
161+
elif [[ "$i" != "" ]]; then
162+
usage "Unexpected argument ‘$i"
163+
fi
164+
;;
165+
esac
166+
else # looking for argument after option
167+
if [[ "$i" == -* ]]; then
168+
usage "Option $requireArgument missing argument"
169+
else
170+
case $requireArgument in
171+
-wd|--working-directory)
172+
optWorkingDirectory="$i"
173+
requireArgument=""
174+
;;
175+
-e|--environment-directory)
176+
optEnvPath="$i"
177+
requireArgument=""
178+
;;
179+
-t|--tests-directory)
180+
optTestPath="$i"
181+
requireArgument=""
182+
;;
183+
esac
184+
if [[ "$requireArgument" != "" ]]; then
185+
errorExit "Internal error, argument expected on none argument option, contact developer"
186+
fi
187+
fi
188+
fi
189+
done
190+
191+
# check last command line option isn’t missing an argument
192+
193+
if [[ "$requireArgument" != "" ]]; then
194+
usage "Option $requireArgument missing argument"
195+
fi
196+
197+
if [[ "$argSourceDirectory" == "" ]]; then
198+
usage "Missing sourceDirectory"
199+
fi
200+
201+
##########################################################################################
202+
203+
# Args scanned, now locate environment directory.
204+
# Try in order:
205+
# - -e=path argument
206+
# - Is there an Environment folder in the current WD?
207+
# - Is there an Environment folder relative to the script source?
208+
# If all fail barf
209+
210+
envDirectoryName="Environment"
211+
libRelativePath="Tools/lib/common.bash"
212+
envPath=
213+
214+
# first locate the environment
215+
# check for script library within the folder as the (minimal) test for validity
216+
if [[ ("$optEnvPath" != "") && (-f "${optEnvPath}/${libRelativePath}") ]]; then
217+
envPath="${optEnvPath}"
218+
envSrc="ARG"
219+
elif [[ -f "${envDirectoryName}/${libRelativePath}" ]]; then
220+
envPath="${envDirectoryName}"
221+
envSrc="CWD"
222+
elif [[ -f "${ScriptDir}/${envDirectoryName}/${libRelativePath}" ]]; then
223+
envPath="${ScriptDir}/${envDirectoryName}"
224+
envSrc="ADJ"
225+
else
226+
echo "Could not locate “${envDirectoryName}” directory" 1>&2
227+
echo "Consult the documentation" 1>&2
228+
exit -1
229+
fi
230+
231+
envPath=$(realpath "$envPath")
232+
233+
# Environment located, can now source our common library from the environment
234+
source "${envPath}/${libRelativePath}"
235+
236+
# we now have debugEcho…
237+
debugEcho "envPath = [$envSrc] ${envPath}"
238+
239+
##########################################################################################
240+
241+
# Environment found, common source loaded, now locate the tests directory.
242+
# this does not validate the structure of the tests folder in any way
243+
# Try in order:
244+
# - -t=path argument
245+
# - Is there a Tests folder in the current WD?
246+
# - Is there a Tests folder relative to the script source?
247+
# If all fail barf
248+
249+
# Much shorter than above as we can now use the common source version
250+
251+
testPath=
252+
searchForDirectory testPath "$optTestPath" "Tests" "" "" "$ScriptDir" ""
253+
254+
# pass on to DoChecksAndTests below – avoids DoChecksAndTests needing to search (and possibly failing)
255+
doChecksArgs+=("-t=${testPath}")
256+
257+
##########################################################################################
258+
259+
# Final checks and then source/call others to do the work
260+
261+
# validate source directory and add to args
262+
validateDirectoryPath sourceDirectory "$argSourceDirectory" "Invalid source directory \"$argSourceDirectory\"" -1
263+
doChecksArgs+=("$sourceDirectory")
264+
265+
# create working directory if needed and add to command
266+
if [[ "$optWorkingDirectory" != "" ]]; then
267+
validateOrCreateDirectoryPath baseWorkingDirectory "$optWorkingDirectory" "Failed to create/access \"$optWorkingDirectory\""
268+
doChecksArgs+=("-wd=$baseWorkingDirectory")
269+
fi
270+
271+
# sanity precheck the environment
272+
if [[ ! -f "${envPath}/setup.SourceMe" ]]; then
273+
errorEcho "File ”setup.SourceMe” is missing in the environment directory."
274+
errorEcho "($envPath)"
275+
errorExit "Cannot setup the environment"
276+
fi
277+
278+
if [[ ${beVerbose} == true ]]; then
279+
source "${envPath}/setup.SourceMe"
280+
else
281+
echo "Configuring environment..."
282+
source "${envPath}/setup.SourceMe" >/dev/null
283+
fi
284+
285+
exitStatus=$?
286+
if [[ $exitStatus != 0 ]]; then # did setup succeed?
287+
exit $exitStatus
288+
fi
289+
290+
# sanity postcheck the environment
291+
for i in antlr grun BuildGrammar; do
292+
which $i >/dev/null
293+
if [[ $? != 0 ]]; then
294+
errorExit "Command “${i}” not found in environment"
295+
fi
296+
done
297+
298+
for i in f:BG_BASHLIBRARY d:BG_MODIFICATIONSETS f:BG_GRUNTREE_GRAMMAR d:BG_LIB_PARSINGTESTS; do
299+
_kind=${i:0:1}
300+
_var=${i:2}
301+
_target="${!_var}"
302+
debugEcho "Checking: ${_kind} | ${_var}=${_target}"
303+
if [[ "${_target}" == "" ]]; then
304+
errorExit "Variable ${_var} not defined"
305+
elif [[ (${_kind} == d) && (! -d "${_target}") ]]; then
306+
errorExit "${_var} must reference a directory"
307+
elif [[ (${_kind} == f) && (! -f "${_target}") ]]; then
308+
errorExit "${_var} must reference a file"
309+
fi
310+
done
311+
312+
# we seem to have what we expect, run the tests…
313+
314+
# use a DoChecksAndTests in testPath
315+
if [[ -x "${testPath}/DoChecksAndTests" ]]; then
316+
"${testPath}/DoChecksAndTests" "${doChecksArgs[@]}"
317+
exit $?
318+
fi
319+
320+
# check for DoChecksAndTests in the PATH
321+
which DoChecksAndTests >/dev/null
322+
if [[ $? == 0 ]]; then
323+
DoChecksAndTests "${doChecksArgs[@]}"
324+
exit $?
325+
fi
326+
327+
errorEcho "Script ”DoChecksAndTests” not found in the tests directory or PATH."
328+
errorEcho "Tests directory: $testPath"
329+
errorExit "Cannot run the tests"

tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-B/Reference/sample.gruntree.red.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,7 @@
12131213
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝
12141214
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ is
12151215
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
1216-
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type
1216+
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ pattern
12171217
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
12181218
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ identifier
12191219
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ Action

tools/GrammarTesting/Tests/Parsing/Samples/v6/AllInOneNoPreprocessor-v6-split/part-B/Reference/sample.tree.red.txt

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
line 10:12 no viable alternative at input '>'
2-
line 10:14 extraneous input '>' expecting {'_', '-', '--', '!', '..', '(', '&', '^', '+', '++', '~', 'add', 'alias', 'ascending', 'async', 'await', 'base', 'bool', 'by', 'byte', 'char', 'checked', 'decimal', 'delegate', 'descending', 'double', 'dynamic', 'equals', 'float', 'from', 'get', 'global', 'group', 'int', 'into', 'join', 'let', 'long', 'nameof', 'new', 'notnull', 'object', 'on', 'orderby', 'partial', 'remove', 'sbyte', 'select', 'set', 'short', 'sizeof', 'stackalloc', 'string', 'this', 'typeof', 'uint', 'ulong', 'unchecked', 'unmanaged', 'ushort', 'value', 'var', 'when', 'where', 'yield', 'default', 'null', 'true', 'false', '*', Simple_Identifier, Integer_Literal, Real_Literal, Character_Literal, String_Literal, Interpolated_Regular_String_Start, Interpolated_Verbatim_String_Start}
2+
line 10:14 extraneous input '>' expecting {'_', '-', '--', '!', '..', '(', '&', '^', '+', '++', '~', 'add', 'alias', 'and', 'ascending', 'async', 'await', 'base', 'bool', 'by', 'byte', 'char', 'checked', 'decimal', 'delegate', 'descending', 'double', 'dynamic', 'equals', 'float', 'from', 'get', 'global', 'group', 'int', 'into', 'join', 'let', 'long', 'nameof', 'new', 'not', 'notnull', 'object', 'on', 'or', 'orderby', 'partial', 'remove', 'sbyte', 'select', 'set', 'short', 'sizeof', 'stackalloc', 'string', 'this', 'typeof', 'uint', 'ulong', 'unchecked', 'unmanaged', 'ushort', 'value', 'var', 'when', 'where', 'yield', 'default', 'null', 'true', 'false', '*', Simple_Identifier, Integer_Literal, Real_Literal, Character_Literal, String_Literal, Interpolated_Regular_String_Start, Interpolated_Verbatim_String_Start}
33
line 11:8 no viable alternative at input '>'

tools/GrammarTesting/Tests/Parsing/Samples/v8/Type argument list/Reference/sample.gruntree.red.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@
482482
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝
483483
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ is
484484
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
485-
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type
485+
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ pattern
486486
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
487487
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ namespace_or_type_name
488488
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
@@ -1022,7 +1022,7 @@
10221022
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝
10231023
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ is
10241024
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
1025-
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type
1025+
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ pattern
10261026
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
10271027
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ namespace_or_type_name
10281028
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
@@ -1215,7 +1215,7 @@
12151215
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝
12161216
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ is
12171217
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
1218-
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type
1218+
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ pattern
12191219
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
12201220
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ namespace_or_type_name
12211221
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
@@ -1349,7 +1349,7 @@
13491349
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝
13501350
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ is
13511351
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
1352-
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ type
1352+
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ pattern
13531353
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛
13541354
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ namespace_or_type_name
13551355
⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎛

0 commit comments

Comments
 (0)