doc/TaskJuggler/SyntaxReference.html in taskjuggler-0.0.7 vs doc/TaskJuggler/SyntaxReference.html in taskjuggler-0.0.8
- old
+ new
@@ -165,16 +165,22 @@
<li><a href="../TaskJuggler/ChargeSet.html">TaskJuggler::ChargeSet</a></li>
<li><a href="../TaskJuggler/ChargeSetListAttribute.html">TaskJuggler::ChargeSetListAttribute</a></li>
+ <li><a href="../TaskJuggler/CollisionDetector.html">TaskJuggler::CollisionDetector</a></li>
+
<li><a href="../TaskJuggler/ColumnListAttribute.html">TaskJuggler::ColumnListAttribute</a></li>
<li><a href="../TaskJuggler/ColumnTable.html">TaskJuggler::ColumnTable</a></li>
<li><a href="../TaskJuggler/Daemon.html">TaskJuggler::Daemon</a></li>
+ <li><a href="../TaskJuggler/DataCache.html">TaskJuggler::DataCache</a></li>
+
+ <li><a href="../TaskJuggler/DataCacheEntry.html">TaskJuggler::DataCacheEntry</a></li>
+
<li><a href="../TaskJuggler/DateAttribute.html">TaskJuggler::DateAttribute</a></li>
<li><a href="../TaskJuggler/DefinitionListAttribute.html">TaskJuggler::DefinitionListAttribute</a></li>
<li><a href="../TaskJuggler/DependencyListAttribute.html">TaskJuggler::DependencyListAttribute</a></li>
@@ -277,11 +283,11 @@
<li><a href="../TaskJuggler/NikuResource.html">TaskJuggler::NikuResource</a></li>
<li><a href="../TaskJuggler/NodeListAttribute.html">TaskJuggler::NodeListAttribute</a></li>
- <li><a href="../TaskJuggler/OnShiftCache.html">TaskJuggler::OnShiftCache</a></li>
+ <li><a href="../TaskJuggler/PlaceHolderCell.html">TaskJuggler::PlaceHolderCell</a></li>
<li><a href="../TaskJuggler/ProcessIntercom.html">TaskJuggler::ProcessIntercom</a></li>
<li><a href="../TaskJuggler/ProcessIntercomIface.html">TaskJuggler::ProcessIntercomIface</a></li>
@@ -457,10 +463,14 @@
<li><a href="../TaskJuggler/TextParser/Rule.html">TaskJuggler::TextParser::Rule</a></li>
<li><a href="../TaskJuggler/TextParser/StackElement.html">TaskJuggler::TextParser::StackElement</a></li>
+ <li><a href="../TaskJuggler/TextParser/State.html">TaskJuggler::TextParser::State</a></li>
+
+ <li><a href="../TaskJuggler/TextParser/StateTransition.html">TaskJuggler::TextParser::StateTransition</a></li>
+
<li><a href="../TaskJuggler/TextParser/TextParserResultArray.html">TaskJuggler::TextParser::TextParserResultArray</a></li>
<li><a href="../TaskJuggler/TextParser/TokenDoc.html">TaskJuggler::TextParser::TokenDoc</a></li>
<li><a href="../TaskJuggler/TextReport.html">TaskJuggler::TextReport</a></li>
@@ -1019,43 +1029,43 @@
<div class="method-source-code"
id="attributes-source">
<pre>
- <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 224</span>
-224: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">token</span>, <span class="ruby-identifier">scenarioSpecific</span>)
-225: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Token #{token} must reference a rule"</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">!!</span>
-226: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">1</span>, <span class="ruby-identifier">token</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)
-227: <span class="ruby-comment cmt"># Find the matching rule.</span>
-228: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>]
-229: <span class="ruby-identifier">attrs</span> = {}
-230: <span class="ruby-comment cmt"># Now we look at the first token of each pattern.</span>
-231: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pattern</span><span class="ruby-operator">|</span>
-232: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">__</span>
-233: <span class="ruby-comment cmt"># If it's a terminal symbol, we found what we are looking for. We add</span>
-234: <span class="ruby-comment cmt"># it to the attrs hash and mark it as non scenario specific.</span>
-235: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span>
-236: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'!scenarioIdCol'</span>
-237: <span class="ruby-comment cmt"># A reference to the !scenarioId rule marks the next token of the</span>
-238: <span class="ruby-comment cmt"># pattern as a reference to a rule with all scenario specific</span>
-239: <span class="ruby-comment cmt"># attributes.</span>
-240: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">true</span>))
-241: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
-242: <span class="ruby-comment cmt"># In case we have a reference to another rule, we just follow the</span>
-243: <span class="ruby-comment cmt"># reference. If the pattern is documented we don't have to follow the</span>
-244: <span class="ruby-comment cmt"># reference. We can use the pattern instead.</span>
-245: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span>.<span class="ruby-identifier">nil?</span>
-246: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">scenarioSpecific</span>))
-247: <span class="ruby-keyword kw">else</span>
-248: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span>
-249: <span class="ruby-keyword kw">end</span>
-250: <span class="ruby-keyword kw">else</span>
-251: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Hit unknown token #{token}"</span>
-252: <span class="ruby-keyword kw">end</span>
-253: <span class="ruby-keyword kw">end</span>
-254: <span class="ruby-identifier">attrs</span>
-255: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 223</span>
+223: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">token</span>, <span class="ruby-identifier">scenarioSpecific</span>)
+224: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Token #{token} must reference a rule"</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">!=</span> <span class="ruby-value">:reference</span>
+225: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>[<span class="ruby-value">1</span>]
+226: <span class="ruby-comment cmt"># Find the matching rule.</span>
+227: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>]
+228: <span class="ruby-identifier">attrs</span> = {}
+229: <span class="ruby-comment cmt"># Now we look at the first token of each pattern.</span>
+230: <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pattern</span><span class="ruby-operator">|</span>
+231: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:literal</span>
+232: <span class="ruby-comment cmt"># If it's a terminal symbol, we found what we are looking for. We add</span>
+233: <span class="ruby-comment cmt"># it to the attrs hash and mark it as non scenario specific.</span>
+234: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span>
+235: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:scenarioIdCol</span>
+236: <span class="ruby-comment cmt"># A reference to the !scenarioId rule marks the next token of the</span>
+237: <span class="ruby-comment cmt"># pattern as a reference to a rule with all scenario specific</span>
+238: <span class="ruby-comment cmt"># attributes.</span>
+239: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">true</span>))
+240: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span>
+241: <span class="ruby-comment cmt"># In case we have a reference to another rule, we just follow the</span>
+242: <span class="ruby-comment cmt"># reference. If the pattern is documented we don't have to follow the</span>
+243: <span class="ruby-comment cmt"># reference. We can use the pattern instead.</span>
+244: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span>.<span class="ruby-identifier">nil?</span>
+245: <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">merge!</span>(<span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">scenarioSpecific</span>))
+246: <span class="ruby-keyword kw">else</span>
+247: <span class="ruby-identifier">attrs</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-identifier">scenarioSpecific</span>
+248: <span class="ruby-keyword kw">end</span>
+249: <span class="ruby-keyword kw">else</span>
+250: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Hit unknown token #{token}"</span>
+251: <span class="ruby-keyword kw">end</span>
+252: <span class="ruby-keyword kw">end</span>
+253: <span class="ruby-identifier">attrs</span>
+254: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1082,33 +1092,33 @@
<div class="method-source-code"
id="check-eyword-source">
<pre>
- <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 257</span>
-257: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkKeyword</span>(<span class="ruby-identifier">keyword</span>)
-258: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@keywords</span>[<span class="ruby-identifier">keyword</span>].<span class="ruby-identifier">nil?</span>
-259: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span>
-260: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"ERROR: #{keyword} is not a known keyword.\n\n"</span>
-261: <span class="ruby-keyword kw">end</span>
-262: <span class="ruby-comment cmt"># Create list of top-level keywords.</span>
-263: <span class="ruby-identifier">kwdStr</span> = <span class="ruby-value str">''</span>
-264: <span class="ruby-ivar">@keywords</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">kwd</span><span class="ruby-operator">|</span>
-265: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span>
-266: (<span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">kwd</span>)
-267: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">', '</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">kwdStr</span>.<span class="ruby-identifier">empty?</span>
-268: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">keyword</span>
-269: <span class="ruby-keyword kw">end</span>
-270: <span class="ruby-keyword kw">end</span>
-271: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">"Try one of the following keywords as argument to this "</span> <span class="ruby-operator">+</span>
-272: <span class="ruby-value str">"program:\n"</span>
-273: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"#{kwdStr}"</span>
-274: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
-275: <span class="ruby-keyword kw">end</span>
-276:
-277: <span class="ruby-keyword kw">true</span>
-278: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/SyntaxReference.rb, line 256</span>
+256: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkKeyword</span>(<span class="ruby-identifier">keyword</span>)
+257: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@keywords</span>[<span class="ruby-identifier">keyword</span>].<span class="ruby-identifier">nil?</span>
+258: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">keyword</span>.<span class="ruby-identifier">nil?</span>
+259: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"ERROR: #{keyword} is not a known keyword.\n\n"</span>
+260: <span class="ruby-keyword kw">end</span>
+261: <span class="ruby-comment cmt"># Create list of top-level keywords.</span>
+262: <span class="ruby-identifier">kwdStr</span> = <span class="ruby-value str">''</span>
+263: <span class="ruby-ivar">@keywords</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">kwd</span><span class="ruby-operator">|</span>
+264: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span>
+265: (<span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">contexts</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">kwd</span>)
+266: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">', '</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">kwdStr</span>.<span class="ruby-identifier">empty?</span>
+267: <span class="ruby-identifier">kwdStr</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">kwd</span>.<span class="ruby-identifier">keyword</span>
+268: <span class="ruby-keyword kw">end</span>
+269: <span class="ruby-keyword kw">end</span>
+270: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">"Try one of the following keywords as argument to this "</span> <span class="ruby-operator">+</span>
+271: <span class="ruby-value str">"program:\n"</span>
+272: <span class="ruby-identifier">$stderr</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"#{kwdStr}"</span>
+273: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+274: <span class="ruby-keyword kw">end</span>
+275:
+276: <span class="ruby-keyword kw">true</span>
+277: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1150,29 +1160,28 @@
194: <span class="ruby-keyword kw">return</span> {} <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">stack</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">doc</span>
195:
196: <span class="ruby-comment cmt"># Push pattern onto 'stack'.</span>
197: <span class="ruby-identifier">stack</span>[<span class="ruby-identifier">pattern</span>] = <span class="ruby-keyword kw">true</span>
198:
-199: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'_{'</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">2</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'_}'</span>
+199: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">0</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'{'</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">pattern</span>[<span class="ruby-value">2</span>][<span class="ruby-value">1</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'}'</span>
200: <span class="ruby-comment cmt"># We have found an optional attribute pattern!</span>
201: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attributes</span>(<span class="ruby-identifier">pattern</span>[<span class="ruby-value">1</span>], <span class="ruby-keyword kw">false</span>)
202: <span class="ruby-keyword kw">end</span>
203:
204: <span class="ruby-comment cmt"># If a token of the pattern is a reference, we recursively</span>
205: <span class="ruby-comment cmt"># follow the reference to the next pattern.</span>
-206: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">token</span><span class="ruby-operator">|</span>
-207: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">token</span>[<span class="ruby-value">0</span>] <span class="ruby-operator">==</span> <span class="ruby-value">!!</span>
-208: <span class="ruby-identifier">token</span> = <span class="ruby-identifier">token</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">1</span>, <span class="ruby-identifier">token</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)
-209: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">token</span>]
-210: <span class="ruby-comment cmt"># Rules with multiple patterns won't lead to attributes.</span>
-211: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
-212:
-213: <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">optionalAttributes</span>(<span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">stack</span>)
-214: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attrs</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">empty?</span>
-215: <span class="ruby-keyword kw">end</span>
-216: <span class="ruby-keyword kw">end</span>
-217: {}
-218: <span class="ruby-keyword kw">end</span></pre>
+206: <span class="ruby-identifier">pattern</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">type</span>, <span class="ruby-identifier">name</span><span class="ruby-operator">|</span>
+207: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:reference</span>
+208: <span class="ruby-identifier">rule</span> = <span class="ruby-ivar">@parser</span>.<span class="ruby-identifier">rules</span>[<span class="ruby-identifier">name</span>]
+209: <span class="ruby-comment cmt"># Rules with multiple patterns won't lead to attributes.</span>
+210: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
+211:
+212: <span class="ruby-identifier">attrs</span> = <span class="ruby-identifier">optionalAttributes</span>(<span class="ruby-identifier">rule</span>.<span class="ruby-identifier">patterns</span>[<span class="ruby-value">0</span>], <span class="ruby-identifier">stack</span>)
+213: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">attrs</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">attrs</span>.<span class="ruby-identifier">empty?</span>
+214: <span class="ruby-keyword kw">end</span>
+215: <span class="ruby-keyword kw">end</span>
+216: {}
+217: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>