1 /*
2  * Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
3  * Use of this file is governed by the BSD 3-clause license that
4  * can be found in the LICENSE.txt file in the project root.
5  */
6 
7 module antlr.v4.runtime.atn.LexerPushModeAction;
8 
9 import std.format;
10 import antlr.v4.runtime.InterfaceLexer;
11 import antlr.v4.runtime.atn.LexerAction;
12 import antlr.v4.runtime.atn.LexerActionType;
13 import antlr.v4.runtime.misc;
14 
15 /**
16  * @uml
17  * Implements the {@code pushMode} lexer action by calling
18  * {@link Lexer#pushMode} with the assigned mode.
19  */
20 class LexerPushModeAction : LexerAction
21 {
22 
23     public int mode;
24 
25     /**
26      * @uml
27      * Constructs a new {@code pushMode} action with the specified mode value.
28      *  @param mode The mode value to pass to {@link Lexer#pushMode}.
29      */
30     public this(int mode)
31     {
32         this.mode = mode;
33     }
34 
35     /**
36      * @uml
37      * Get the lexer mode this action should transition the lexer to.
38      *
39      *  @return The lexer mode for this {@code pushMode} command.
40      */
41     public int getMode()
42     {
43         return mode;
44     }
45 
46     /**
47      * @uml
48      * @safe
49      * @nothrow
50      */
51     public LexerActionType getActionType() @safe nothrow
52     {
53         return LexerActionType.PUSH_MODE;
54     }
55 
56     /**
57      * @uml
58      * {@inheritDoc}
59      *  @return This method returns {@code false}.
60      */
61     public bool isPositionDependent()
62     {
63         return false;
64     }
65 
66     /**
67      * @uml
68      * {@inheritDoc}
69      *
70      * <p>This action is implemented by calling {@link Lexer#pushMode} with the
71      * value provided by {@link #getMode}.</p>
72      */
73     public void execute(InterfaceLexer lexer)
74     {
75         lexer.pushMode(mode);
76     }
77 
78     /**
79      * @uml
80      * @safe
81      * @nothrow
82      * @override
83      */
84     public override size_t toHash() @safe nothrow
85     {
86         size_t hash = MurmurHash.initialize();
87         hash = MurmurHash.update(hash, Utils.rank(getActionType));
88         return MurmurHash.finish(hash, 1);
89 
90     }
91 
92     public bool equals(Object obj)
93     {
94         if (obj == this) {
95             return true;
96         }
97         else if (obj.classinfo != LexerPushModeAction.classinfo) {
98             return false;
99         }
100         return mode == (cast(LexerPushModeAction)obj).mode;
101     }
102 
103     /**
104      * @uml
105      * @override
106      */
107     public override string toString()
108     {
109         return format("pushMode(%d)", mode);
110     }
111 
112 }
113 
114 unittest
115 {
116     auto pushModeAction = new LexerPushModeAction(0);
117 }