Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > dd7a95aabe1c049ac9f84beede8143d3 > files > 1838

synopsis-doc-0.12-4.fc14.i686.rpm

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<!-- Source/Synopsis/Parsers/Python/ASGTranslator.py.html -->
<!-- this view was generated by Source -->
<head>
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"/>
<title >Synopsis - Synopsis/Parsers/Python/ASGTranslator.py</title>
<link href="../../../../style.css" type="text/css" rel="stylesheet" />
</head>
<body class="Source">
<div class="navigation">
<span class="normal"><a href="../../../../Scopes/Synopsis.html" >Global Package</a></span>
<span class="normal"><a href="../../../../InheritanceTree.html" >Inheritance Tree</a></span>
<span class="normal"><a href="../../../../InheritanceGraph.html" >Inheritance Graph</a></span>
<span class="normal"><a href="../../../../NameIndex.html" >Name Index</a></span>
</div>
File: <b >Synopsis/Parsers/Python/ASGTranslator.py</b><pre class="sxr"><a id="line1"></a><span class="lineno">  1</span><span class="line"><span class="py-comment">#</span></span>
<a id="line2"></a><span class="lineno">  2</span><span class="line"><span class="py-comment"># Copyright (C) 2008 Stefan Seefeld</span></span>
<a id="line3"></a><span class="lineno">  3</span><span class="line"><span class="py-comment"># All rights reserved.</span></span>
<a id="line4"></a><span class="lineno">  4</span><span class="line"><span class="py-comment"># Licensed to the public under the terms of the GNU LGPL (&gt;= 2),</span></span>
<a id="line5"></a><span class="lineno">  5</span><span class="line"><span class="py-comment"># see the file COPYING for details.</span></span>
<a id="line6"></a><span class="lineno">  6</span><span class="line"><span class="py-comment">#</span></span>
<a id="line7"></a><span class="lineno">  7</span>
<a id="line8"></a><span class="lineno">  8</span><span class="line"><span class="py-keyword">from</span> Synopsis <span class="py-keyword">import</span> ASG</span>
<a id="line9"></a><span class="lineno">  9</span><span class="line"><span class="py-keyword">from</span> Synopsis.QualifiedName <span class="py-keyword">import</span> QualifiedPythonName <span class="py-keyword">as</span> QName</span>
<a id="line10"></a><span class="lineno"> 10</span><span class="line"><span class="py-keyword">from</span> Synopsis.SourceFile <span class="py-keyword">import</span> *</span>
<a id="line11"></a><span class="lineno"> 11</span><span class="line"><span class="py-keyword">from</span> Synopsis.DocString <span class="py-keyword">import</span> DocString</span>
<a id="line12"></a><span class="lineno"> 12</span><span class="line"><span class="py-keyword">import</span> sys, os.path</span>
<a id="line13"></a><span class="lineno"> 13</span><span class="line"><span class="py-keyword">import</span> compiler, tokenize, token</span>
<a id="line14"></a><span class="lineno"> 14</span><span class="line"><span class="py-keyword">from</span> compiler.consts <span class="py-keyword">import</span> OP_ASSIGN</span>
<a id="line15"></a><span class="lineno"> 15</span><span class="line"><span class="py-keyword">from</span> compiler.visitor <span class="py-keyword">import</span> ASTVisitor</span>
<a id="line16"></a><span class="lineno"> 16</span>
<a id="line17"></a><span class="lineno"> 17</span><span class="line"><span class="py-keyword">class</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html">TokenParser</a>:</span>
<a id="line18"></a><span class="lineno"> 18</span>
<a id="line19"></a><span class="lineno"> 19</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#__init__">__init__</a>(self, text):</span>
<a id="line20"></a><span class="lineno"> 20</span><span class="line">        self.text = text + <span class="py-string">'\n\n'</span></span>
<a id="line21"></a><span class="lineno"> 21</span><span class="line">        self.lines = self.text.splitlines(1)</span>
<a id="line22"></a><span class="lineno"> 22</span><span class="line">        self.generator = tokenize.generate_tokens(iter(self.lines).next)</span>
<a id="line23"></a><span class="lineno"> 23</span><span class="line">        self.next()</span>
<a id="line24"></a><span class="lineno"> 24</span>
<a id="line25"></a><span class="lineno"> 25</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#__iter__">__iter__</a>(self):</span>
<a id="line26"></a><span class="lineno"> 26</span><span class="line">        <span class="py-keyword">return</span> self</span>
<a id="line27"></a><span class="lineno"> 27</span>
<a id="line28"></a><span class="lineno"> 28</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#next">next</a>(self):</span>
<a id="line29"></a><span class="lineno"> 29</span><span class="line">        self.token = self.generator.next()</span>
<a id="line30"></a><span class="lineno"> 30</span><span class="line">        self.type, self.string, self.start, self.end, self.line = self.token</span>
<a id="line31"></a><span class="lineno"> 31</span><span class="line">        <span class="py-keyword">return</span> self.token</span>
<a id="line32"></a><span class="lineno"> 32</span>
<a id="line33"></a><span class="lineno"> 33</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#goto_line">goto_line</a>(self, lineno):</span>
<a id="line34"></a><span class="lineno"> 34</span><span class="line">        <span class="py-keyword">while</span> self.start[0] &lt; lineno:</span>
<a id="line35"></a><span class="lineno"> 35</span><span class="line">            self.next()</span>
<a id="line36"></a><span class="lineno"> 36</span><span class="line">        <span class="py-keyword">return</span> token</span>
<a id="line37"></a><span class="lineno"> 37</span>
<a id="line38"></a><span class="lineno"> 38</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#rhs">rhs</a>(self, lineno):</span>
<a id="line39"></a><span class="lineno"> 39</span><span class="line">        <span class="py-string">&quot;&quot;&quot;</span></span>
<a id="line40"></a><span class="lineno"> 40</span><span class="line"><span class="py-string">        Return a whitespace-normalized expression string from the right-hand</span></span>
<a id="line41"></a><span class="lineno"> 41</span><span class="line"><span class="py-string">        side of an assignment at line `lineno`.</span></span>
<a id="line42"></a><span class="lineno"> 42</span><span class="line"><span class="py-string">        &quot;&quot;&quot;</span></span>
<a id="line43"></a><span class="lineno"> 43</span><span class="line">        self.goto_line(lineno)</span>
<a id="line44"></a><span class="lineno"> 44</span><span class="line">        <span class="py-keyword">while</span> self.string != <span class="py-string">'='</span>:</span>
<a id="line45"></a><span class="lineno"> 45</span><span class="line">            self.next()</span>
<a id="line46"></a><span class="lineno"> 46</span><span class="line">        self.stack = None</span>
<a id="line47"></a><span class="lineno"> 47</span><span class="line">        <span class="py-keyword">while</span> self.type != token.NEWLINE <span class="py-keyword">and</span> self.string != <span class="py-string">';'</span>:</span>
<a id="line48"></a><span class="lineno"> 48</span><span class="line">            <span class="py-keyword">if</span> self.string == <span class="py-string">'='</span> <span class="py-keyword">and</span> <span class="py-keyword">not</span> self.stack:</span>
<a id="line49"></a><span class="lineno"> 49</span><span class="line">                self.tokens = []</span>
<a id="line50"></a><span class="lineno"> 50</span><span class="line">                self.stack = []</span>
<a id="line51"></a><span class="lineno"> 51</span><span class="line">                self._type = None</span>
<a id="line52"></a><span class="lineno"> 52</span><span class="line">                self._string = None</span>
<a id="line53"></a><span class="lineno"> 53</span><span class="line">                self._backquote = 0</span>
<a id="line54"></a><span class="lineno"> 54</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line55"></a><span class="lineno"> 55</span><span class="line">                self.note_token()</span>
<a id="line56"></a><span class="lineno"> 56</span><span class="line">            self.next()</span>
<a id="line57"></a><span class="lineno"> 57</span><span class="line">        self.next()</span>
<a id="line58"></a><span class="lineno"> 58</span><span class="line">        text = <span class="py-string">''</span>.join(self.tokens)</span>
<a id="line59"></a><span class="lineno"> 59</span><span class="line">        <span class="py-keyword">return</span> text.strip()</span>
<a id="line60"></a><span class="lineno"> 60</span>
<a id="line61"></a><span class="lineno"> 61</span><span class="line">    closers = {<span class="py-string">')'</span>: <span class="py-string">'('</span>, <span class="py-string">']'</span>: <span class="py-string">'['</span>, <span class="py-string">'}'</span>: <span class="py-string">'{'</span>}</span>
<a id="line62"></a><span class="lineno"> 62</span><span class="line">    openers = {<span class="py-string">'('</span>: 1, <span class="py-string">'['</span>: 1, <span class="py-string">'{'</span>: 1}</span>
<a id="line63"></a><span class="lineno"> 63</span><span class="line">    del_ws_prefix = {<span class="py-string">'.'</span>: 1, <span class="py-string">'='</span>: 1, <span class="py-string">')'</span>: 1, <span class="py-string">']'</span>: 1, <span class="py-string">'}'</span>: 1, <span class="py-string">':'</span>: 1, <span class="py-string">','</span>: 1}</span>
<a id="line64"></a><span class="lineno"> 64</span><span class="line">    no_ws_suffix = {<span class="py-string">'.'</span>: 1, <span class="py-string">'='</span>: 1, <span class="py-string">'('</span>: 1, <span class="py-string">'['</span>: 1, <span class="py-string">'{'</span>: 1}</span>
<a id="line65"></a><span class="lineno"> 65</span>
<a id="line66"></a><span class="lineno"> 66</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#note_token">note_token</a>(self):</span>
<a id="line67"></a><span class="lineno"> 67</span><span class="line">        <span class="py-keyword">if</span> self.type == tokenize.NL:</span>
<a id="line68"></a><span class="lineno"> 68</span><span class="line">            <span class="py-keyword">return</span></span>
<a id="line69"></a><span class="lineno"> 69</span><span class="line">        del_ws = self.del_ws_prefix.has_key(self.string)</span>
<a id="line70"></a><span class="lineno"> 70</span><span class="line">        append_ws = <span class="py-keyword">not</span> self.no_ws_suffix.has_key(self.string)</span>
<a id="line71"></a><span class="lineno"> 71</span><span class="line">        <span class="py-keyword">if</span> self.openers.has_key(self.string):</span>
<a id="line72"></a><span class="lineno"> 72</span><span class="line">            self.stack.append(self.string)</span>
<a id="line73"></a><span class="lineno"> 73</span><span class="line">            <span class="py-keyword">if</span> (self._type == token.NAME</span>
<a id="line74"></a><span class="lineno"> 74</span><span class="line">                <span class="py-keyword">or</span> self.closers.has_key(self._string)):</span>
<a id="line75"></a><span class="lineno"> 75</span><span class="line">                del_ws = 1</span>
<a id="line76"></a><span class="lineno"> 76</span><span class="line">        <span class="py-keyword">elif</span> self.closers.has_key(self.string):</span>
<a id="line77"></a><span class="lineno"> 77</span><span class="line">            <span class="py-keyword">assert</span> self.stack[-1] == self.closers[self.string]</span>
<a id="line78"></a><span class="lineno"> 78</span><span class="line">            self.stack.pop()</span>
<a id="line79"></a><span class="lineno"> 79</span><span class="line">        <span class="py-keyword">elif</span> self.string == <span class="py-string">'`'</span>:</span>
<a id="line80"></a><span class="lineno"> 80</span><span class="line">            <span class="py-keyword">if</span> self._backquote:</span>
<a id="line81"></a><span class="lineno"> 81</span><span class="line">                del_ws = 1</span>
<a id="line82"></a><span class="lineno"> 82</span><span class="line">                <span class="py-keyword">assert</span> self.stack[-1] == <span class="py-string">'`'</span></span>
<a id="line83"></a><span class="lineno"> 83</span><span class="line">                self.stack.pop()</span>
<a id="line84"></a><span class="lineno"> 84</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line85"></a><span class="lineno"> 85</span><span class="line">                append_ws = 0</span>
<a id="line86"></a><span class="lineno"> 86</span><span class="line">                self.stack.append(<span class="py-string">'`'</span>)</span>
<a id="line87"></a><span class="lineno"> 87</span><span class="line">            self._backquote = <span class="py-keyword">not</span> self._backquote</span>
<a id="line88"></a><span class="lineno"> 88</span><span class="line">        <span class="py-keyword">if</span> del_ws <span class="py-keyword">and</span> self.tokens <span class="py-keyword">and</span> self.tokens[-1] == <span class="py-string">' '</span>:</span>
<a id="line89"></a><span class="lineno"> 89</span><span class="line">            <span class="py-keyword">del</span> self.tokens[-1]</span>
<a id="line90"></a><span class="lineno"> 90</span><span class="line">        self.tokens.append(self.string)</span>
<a id="line91"></a><span class="lineno"> 91</span><span class="line">        self._type = self.type</span>
<a id="line92"></a><span class="lineno"> 92</span><span class="line">        self._string = self.string</span>
<a id="line93"></a><span class="lineno"> 93</span><span class="line">        <span class="py-keyword">if</span> append_ws:</span>
<a id="line94"></a><span class="lineno"> 94</span><span class="line">            self.tokens.append(<span class="py-string">' '</span>)</span>
<a id="line95"></a><span class="lineno"> 95</span>
<a id="line96"></a><span class="lineno"> 96</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/TokenParser.html#function_parameters">function_parameters</a>(self, lineno):</span>
<a id="line97"></a><span class="lineno"> 97</span><span class="line">        <span class="py-string">&quot;&quot;&quot;</span></span>
<a id="line98"></a><span class="lineno"> 98</span><span class="line"><span class="py-string">        Return a dictionary mapping parameters to defaults</span></span>
<a id="line99"></a><span class="lineno"> 99</span><span class="line"><span class="py-string">        (whitespace-normalized strings).</span></span>
<a id="line100"></a><span class="lineno">100</span><span class="line"><span class="py-string">        &quot;&quot;&quot;</span></span>
<a id="line101"></a><span class="lineno">101</span><span class="line">        self.goto_line(lineno)</span>
<a id="line102"></a><span class="lineno">102</span><span class="line">        <span class="py-keyword">while</span> self.string != <span class="py-string">'def'</span>:</span>
<a id="line103"></a><span class="lineno">103</span><span class="line">            self.next()</span>
<a id="line104"></a><span class="lineno">104</span><span class="line">        <span class="py-keyword">while</span> self.string != <span class="py-string">'('</span>:</span>
<a id="line105"></a><span class="lineno">105</span><span class="line">            self.next()</span>
<a id="line106"></a><span class="lineno">106</span><span class="line">        name = None</span>
<a id="line107"></a><span class="lineno">107</span><span class="line">        default = False</span>
<a id="line108"></a><span class="lineno">108</span><span class="line">        parameter_tuple = False</span>
<a id="line109"></a><span class="lineno">109</span><span class="line">        self.tokens = []</span>
<a id="line110"></a><span class="lineno">110</span><span class="line">        parameters = {}</span>
<a id="line111"></a><span class="lineno">111</span><span class="line">        self.stack = [self.string]</span>
<a id="line112"></a><span class="lineno">112</span><span class="line">        self.next()</span>
<a id="line113"></a><span class="lineno">113</span><span class="line">        <span class="py-keyword">while</span> 1:</span>
<a id="line114"></a><span class="lineno">114</span><span class="line">            <span class="py-keyword">if</span> len(self.stack) == 1:</span>
<a id="line115"></a><span class="lineno">115</span><span class="line">                <span class="py-keyword">if</span> parameter_tuple:</span>
<a id="line116"></a><span class="lineno">116</span><span class="line">                    name = <span class="py-string">''</span>.join(self.tokens).strip()</span>
<a id="line117"></a><span class="lineno">117</span><span class="line">                    self.tokens = []</span>
<a id="line118"></a><span class="lineno">118</span><span class="line">                    parameter_tuple = False</span>
<a id="line119"></a><span class="lineno">119</span><span class="line">                <span class="py-keyword">if</span> self.string <span class="py-keyword">in</span> (<span class="py-string">')'</span>, <span class="py-string">','</span>):</span>
<a id="line120"></a><span class="lineno">120</span><span class="line">                    <span class="py-keyword">if</span> name:</span>
<a id="line121"></a><span class="lineno">121</span><span class="line">                        <span class="py-keyword">if</span> self.tokens:</span>
<a id="line122"></a><span class="lineno">122</span><span class="line">                            default_text = <span class="py-string">''</span>.join(self.tokens).strip()</span>
<a id="line123"></a><span class="lineno">123</span><span class="line">                        <span class="py-keyword">else</span>:</span>
<a id="line124"></a><span class="lineno">124</span><span class="line">                            default_text = <span class="py-string">''</span></span>
<a id="line125"></a><span class="lineno">125</span><span class="line">                        parameters[name] = default_text</span>
<a id="line126"></a><span class="lineno">126</span><span class="line">                        self.tokens = []</span>
<a id="line127"></a><span class="lineno">127</span><span class="line">                        name = None</span>
<a id="line128"></a><span class="lineno">128</span><span class="line">                        default = False</span>
<a id="line129"></a><span class="lineno">129</span><span class="line">                    <span class="py-keyword">if</span> self.string == <span class="py-string">')'</span>:</span>
<a id="line130"></a><span class="lineno">130</span><span class="line">                        <span class="py-keyword">break</span></span>
<a id="line131"></a><span class="lineno">131</span><span class="line">                <span class="py-keyword">elif</span> self.type == token.NAME:</span>
<a id="line132"></a><span class="lineno">132</span><span class="line">                    <span class="py-keyword">if</span> name <span class="py-keyword">and</span> default:</span>
<a id="line133"></a><span class="lineno">133</span><span class="line">                        self.note_token()</span>
<a id="line134"></a><span class="lineno">134</span><span class="line">                    <span class="py-keyword">else</span>:</span>
<a id="line135"></a><span class="lineno">135</span><span class="line">                        <span class="py-keyword">assert</span> name <span class="py-keyword">is</span> None, (</span>
<a id="line136"></a><span class="lineno">136</span><span class="line">                            <span class="py-string">'token=%r name=%r parameters=%r stack=%r'</span></span>
<a id="line137"></a><span class="lineno">137</span><span class="line">                            % (self.token, name, parameters, self.stack))</span>
<a id="line138"></a><span class="lineno">138</span><span class="line">                        name = self.string</span>
<a id="line139"></a><span class="lineno">139</span><span class="line">                <span class="py-keyword">elif</span> self.string == <span class="py-string">'='</span>:</span>
<a id="line140"></a><span class="lineno">140</span><span class="line">                    <span class="py-keyword">assert</span> name <span class="py-keyword">is</span> <span class="py-keyword">not</span> None, <span class="py-string">'token=%r'</span> % (self.token,)</span>
<a id="line141"></a><span class="lineno">141</span><span class="line">                    <span class="py-keyword">assert</span> default <span class="py-keyword">is</span> False, <span class="py-string">'token=%r'</span> % (self.token,)</span>
<a id="line142"></a><span class="lineno">142</span><span class="line">                    <span class="py-keyword">assert</span> self.tokens == [], <span class="py-string">'token=%r'</span> % (self.token,)</span>
<a id="line143"></a><span class="lineno">143</span><span class="line">                    default = True</span>
<a id="line144"></a><span class="lineno">144</span><span class="line">                    self._type = None</span>
<a id="line145"></a><span class="lineno">145</span><span class="line">                    self._string = None</span>
<a id="line146"></a><span class="lineno">146</span><span class="line">                    self._backquote = 0</span>
<a id="line147"></a><span class="lineno">147</span><span class="line">                <span class="py-keyword">elif</span> name:</span>
<a id="line148"></a><span class="lineno">148</span><span class="line">                    self.note_token()</span>
<a id="line149"></a><span class="lineno">149</span><span class="line">                <span class="py-keyword">elif</span> self.string == <span class="py-string">'('</span>:</span>
<a id="line150"></a><span class="lineno">150</span><span class="line">                    parameter_tuple = True</span>
<a id="line151"></a><span class="lineno">151</span><span class="line">                    self._type = None</span>
<a id="line152"></a><span class="lineno">152</span><span class="line">                    self._string = None</span>
<a id="line153"></a><span class="lineno">153</span><span class="line">                    self._backquote = 0</span>
<a id="line154"></a><span class="lineno">154</span><span class="line">                    self.note_token()</span>
<a id="line155"></a><span class="lineno">155</span><span class="line">                <span class="py-keyword">else</span>:                   <span class="py-comment"># ignore these tokens:</span></span>
<a id="line156"></a><span class="lineno">156</span><span class="line">                    <span class="py-keyword">assert</span> (self.string <span class="py-keyword">in</span> (<span class="py-string">'*'</span>, <span class="py-string">'**'</span>, <span class="py-string">'\n'</span>)</span>
<a id="line157"></a><span class="lineno">157</span><span class="line">                            <span class="py-keyword">or</span> self.type == tokenize.COMMENT), (</span>
<a id="line158"></a><span class="lineno">158</span><span class="line">                        <span class="py-string">'token=%r'</span> % (self.token,))</span>
<a id="line159"></a><span class="lineno">159</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line160"></a><span class="lineno">160</span><span class="line">                self.note_token()</span>
<a id="line161"></a><span class="lineno">161</span><span class="line">            self.next()</span>
<a id="line162"></a><span class="lineno">162</span><span class="line">        <span class="py-keyword">return</span> parameters</span>
<a id="line163"></a><span class="lineno">163</span>
<a id="line164"></a><span class="lineno">164</span><span class="line"><span class="py-keyword">class</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html">ASGTranslator</a>(ASTVisitor):</span>
<a id="line165"></a><span class="lineno">165</span><span class="line">    <span class="py-string">&quot;&quot;&quot;Translate the Python AST into a Synopsis ASG.&quot;&quot;&quot;</span></span>
<a id="line166"></a><span class="lineno">166</span>
<a id="line167"></a><span class="lineno">167</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#__init__">__init__</a>(self, package, types, docformat):</span>
<a id="line168"></a><span class="lineno">168</span><span class="line">        <span class="py-string">&quot;&quot;&quot;Create an ASGTranslator.</span></span>
<a id="line169"></a><span class="lineno">169</span><span class="line"><span class="py-string"/></span>
<a id="line170"></a><span class="lineno">170</span><span class="line"><span class="py-string">        package: enclosing package the generated modules are to be part of.&quot;&quot;&quot;</span></span>
<a id="line171"></a><span class="lineno">171</span>
<a id="line172"></a><span class="lineno">172</span><span class="line">        ASTVisitor.__init__(self)</span>
<a id="line173"></a><span class="lineno">173</span><span class="line">        self.scope = package <span class="py-keyword">and</span> [package] <span class="py-keyword">or</span> []</span>
<a id="line174"></a><span class="lineno">174</span><span class="line">        self.file = None</span>
<a id="line175"></a><span class="lineno">175</span><span class="line">        self.types = types</span>
<a id="line176"></a><span class="lineno">176</span><span class="line">        self.attributes = []</span>
<a id="line177"></a><span class="lineno">177</span><span class="line">        self.any_type = ASG.BuiltinTypeId(<span class="py-string">'Python'</span>,QName(<span class="py-string">''</span>,))</span>
<a id="line178"></a><span class="lineno">178</span><span class="line">        self.docformat = docformat</span>
<a id="line179"></a><span class="lineno">179</span><span class="line">        self.documentable = None</span>
<a id="line180"></a><span class="lineno">180</span><span class="line">        self.name = QName()</span>
<a id="line181"></a><span class="lineno">181</span><span class="line">        self.imports = []</span>
<a id="line182"></a><span class="lineno">182</span><span class="line">        <span class="py-string">&quot;Tuple with (module, names) pairs.&quot;</span></span>
<a id="line183"></a><span class="lineno">183</span>
<a id="line184"></a><span class="lineno">184</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#process_file">process_file</a>(self, file):</span>
<a id="line185"></a><span class="lineno">185</span>
<a id="line186"></a><span class="lineno">186</span><span class="line">        self.file = file</span>
<a id="line187"></a><span class="lineno">187</span><span class="line">        source = open(self.file.abs_name).read()</span>
<a id="line188"></a><span class="lineno">188</span><span class="line">        self.token_parser = TokenParser(source)</span>
<a id="line189"></a><span class="lineno">189</span><span class="line">        ast = compiler.parse(source)</span>
<a id="line190"></a><span class="lineno">190</span><span class="line">        compiler.walk(ast, self, walker=self)</span>
<a id="line191"></a><span class="lineno">191</span>
<a id="line192"></a><span class="lineno">192</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#scope_name">scope_name</a>(self):</span>
<a id="line193"></a><span class="lineno">193</span><span class="line">        <span class="py-keyword">return</span> len(self.scope) <span class="py-keyword">and</span> self.scope[-1].name <span class="py-keyword">or</span> ()</span>
<a id="line194"></a><span class="lineno">194</span>
<a id="line195"></a><span class="lineno">195</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#default">default</a>(self, node, *args):</span>
<a id="line196"></a><span class="lineno">196</span><span class="line">        self.documentable = None</span>
<a id="line197"></a><span class="lineno">197</span>
<a id="line198"></a><span class="lineno">198</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#default_visit">default_visit</a>(self, node, *args):</span>
<a id="line199"></a><span class="lineno">199</span><span class="line">        ASTVisitor.default(self, node, *args)</span>
<a id="line200"></a><span class="lineno">200</span>
<a id="line201"></a><span class="lineno">201</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitDiscard">visitDiscard</a>(self, node):</span>
<a id="line202"></a><span class="lineno">202</span><span class="line">        <span class="py-keyword">if</span> self.documentable:</span>
<a id="line203"></a><span class="lineno">203</span><span class="line">            self.visit(node.expr)</span>
<a id="line204"></a><span class="lineno">204</span>
<a id="line205"></a><span class="lineno">205</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitConst">visitConst</a>(self, node):</span>
<a id="line206"></a><span class="lineno">206</span><span class="line">        <span class="py-keyword">if</span> self.documentable:</span>
<a id="line207"></a><span class="lineno">207</span><span class="line">            <span class="py-keyword">if</span> type(node.value) <span class="py-keyword">in</span> (str, unicode):</span>
<a id="line208"></a><span class="lineno">208</span><span class="line">                self.documentable.annotations[<span class="py-string">'doc'</span>] = DocString(node.value, self.docformat)</span>
<a id="line209"></a><span class="lineno">209</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line210"></a><span class="lineno">210</span><span class="line">                self.documentable = None</span>
<a id="line211"></a><span class="lineno">211</span>
<a id="line212"></a><span class="lineno">212</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitStmt">visitStmt</a>(self, node):</span>
<a id="line213"></a><span class="lineno">213</span><span class="line">        self.default_visit(node)</span>
<a id="line214"></a><span class="lineno">214</span>
<a id="line215"></a><span class="lineno">215</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitAssign">visitAssign</a>(self, node):</span>
<a id="line216"></a><span class="lineno">216</span>
<a id="line217"></a><span class="lineno">217</span><span class="line">        save_attributes = self.attributes</span>
<a id="line218"></a><span class="lineno">218</span><span class="line">        self.attributes = []</span>
<a id="line219"></a><span class="lineno">219</span><span class="line">        self.in_ass_tuple = False</span>
<a id="line220"></a><span class="lineno">220</span><span class="line">        <span class="py-keyword">for</span> child <span class="py-keyword">in</span> node.nodes:</span>
<a id="line221"></a><span class="lineno">221</span><span class="line">            self.dispatch(child)</span>
<a id="line222"></a><span class="lineno">222</span><span class="line">        <span class="py-keyword">if</span> self.attributes:</span>
<a id="line223"></a><span class="lineno">223</span><span class="line">            <span class="py-keyword">if</span> type(self.scope[-1]) == ASG.Operation:</span>
<a id="line224"></a><span class="lineno">224</span><span class="line">                <span class="py-comment"># Inject the attributes into the class.</span></span>
<a id="line225"></a><span class="lineno">225</span><span class="line">                self.scope[-2].declarations.extend(self.attributes)</span>
<a id="line226"></a><span class="lineno">226</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line227"></a><span class="lineno">227</span><span class="line">                self.scope[-1].declarations.extend(self.attributes)</span>
<a id="line228"></a><span class="lineno">228</span><span class="line">        <span class="py-keyword">if</span> len(self.attributes) == 1:</span>
<a id="line229"></a><span class="lineno">229</span><span class="line">            self.documentable = self.attributes[0]</span>
<a id="line230"></a><span class="lineno">230</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line231"></a><span class="lineno">231</span><span class="line">            self.documentable = None</span>
<a id="line232"></a><span class="lineno">232</span><span class="line">        self.attributes = save_attributes</span>
<a id="line233"></a><span class="lineno">233</span>
<a id="line234"></a><span class="lineno">234</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitModule">visitModule</a>(self, node):</span>
<a id="line235"></a><span class="lineno">235</span>
<a id="line236"></a><span class="lineno">236</span><span class="line">        name = os.path.basename(os.path.splitext(self.file.name)[0])</span>
<a id="line237"></a><span class="lineno">237</span><span class="line">        <span class="py-keyword">if</span> name == <span class="py-string">'__init__'</span>:</span>
<a id="line238"></a><span class="lineno">238</span><span class="line">            name = os.path.basename(os.path.dirname(self.file.name))</span>
<a id="line239"></a><span class="lineno">239</span><span class="line">            qname = QName(self.scope_name() + (name,))</span>
<a id="line240"></a><span class="lineno">240</span><span class="line">            module = ASG.Module(self.file, node.lineno, <span class="py-string">'package'</span>, qname)</span>
<a id="line241"></a><span class="lineno">241</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line242"></a><span class="lineno">242</span><span class="line">            qname = QName(self.scope_name() + (name,))</span>
<a id="line243"></a><span class="lineno">243</span><span class="line">            module = ASG.Module(self.file, node.lineno, <span class="py-string">'module'</span>, qname)</span>
<a id="line244"></a><span class="lineno">244</span><span class="line">        self.types[qname] = ASG.DeclaredTypeId(<span class="py-string">'Python'</span>, qname, module)</span>
<a id="line245"></a><span class="lineno">245</span>
<a id="line246"></a><span class="lineno">246</span><span class="line">        self.scope.append(module)</span>
<a id="line247"></a><span class="lineno">247</span><span class="line">        self.documentable = module</span>
<a id="line248"></a><span class="lineno">248</span><span class="line">        self.visit(node.node)</span>
<a id="line249"></a><span class="lineno">249</span><span class="line">        self.scope.pop()</span>
<a id="line250"></a><span class="lineno">250</span><span class="line">        self.file.declarations.append(module)</span>
<a id="line251"></a><span class="lineno">251</span>
<a id="line252"></a><span class="lineno">252</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitImport">visitImport</a>(self, node):</span>
<a id="line253"></a><span class="lineno">253</span>
<a id="line254"></a><span class="lineno">254</span><span class="line">        self.imports.extend([(n[0], None) <span class="py-keyword">for</span> n <span class="py-keyword">in</span> node.names])</span>
<a id="line255"></a><span class="lineno">255</span><span class="line">        self.documentable = None</span>
<a id="line256"></a><span class="lineno">256</span>
<a id="line257"></a><span class="lineno">257</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitFrom">visitFrom</a>(self, node):</span>
<a id="line258"></a><span class="lineno">258</span>
<a id="line259"></a><span class="lineno">259</span><span class="line">        self.imports.extend([(node.modname, n[0]) <span class="py-keyword">for</span> n <span class="py-keyword">in</span> node.names])</span>
<a id="line260"></a><span class="lineno">260</span><span class="line">        self.documentable = None</span>
<a id="line261"></a><span class="lineno">261</span>
<a id="line262"></a><span class="lineno">262</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitAssName">visitAssName</a>(self, node):</span>
<a id="line263"></a><span class="lineno">263</span>
<a id="line264"></a><span class="lineno">264</span><span class="line">        <span class="py-keyword">if</span> <span class="py-keyword">not</span> self.in_ass_tuple:</span>
<a id="line265"></a><span class="lineno">265</span><span class="line">            meta_tags = [<span class="py-string">'__docformat__'</span>]</span>
<a id="line266"></a><span class="lineno">266</span><span class="line">            <span class="py-keyword">if</span> len(self.scope) == 1 <span class="py-keyword">and</span> node.name <span class="py-keyword">in</span> meta_tags:</span>
<a id="line267"></a><span class="lineno">267</span><span class="line">                expression_text = eval(self.token_parser.rhs(node.lineno))</span>
<a id="line268"></a><span class="lineno">268</span><span class="line">                self.file.annotations[node.name] = expression_text</span>
<a id="line269"></a><span class="lineno">269</span><span class="line">                self.docformat = expression_text</span>
<a id="line270"></a><span class="lineno">270</span>
<a id="line271"></a><span class="lineno">271</span><span class="line">        qname = QName(self.scope_name() + (node.name,))</span>
<a id="line272"></a><span class="lineno">272</span><span class="line">        <span class="py-keyword">if</span> type(self.scope[-1]) <span class="py-keyword">in</span> (ASG.Function, ASG.Operation):</span>
<a id="line273"></a><span class="lineno">273</span><span class="line">            <span class="py-keyword">return</span></span>
<a id="line274"></a><span class="lineno">274</span><span class="line">        <span class="py-keyword">elif</span> type(self.scope[-1]) == ASG.Class:</span>
<a id="line275"></a><span class="lineno">275</span><span class="line">            attribute = ASG.Variable(self.file, node.lineno, <span class="py-string">'class attribute'</span>,</span>
<a id="line276"></a><span class="lineno">276</span><span class="line">                                     qname, self.any_type, False)</span>
<a id="line277"></a><span class="lineno">277</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line278"></a><span class="lineno">278</span><span class="line">            attribute = ASG.Variable(self.file, node.lineno, <span class="py-string">'attribute'</span>,</span>
<a id="line279"></a><span class="lineno">279</span><span class="line">                                     qname, self.any_type, False)</span>
<a id="line280"></a><span class="lineno">280</span><span class="line">        <span class="py-keyword">if</span> node.name.startswith(<span class="py-string">'__'</span>):</span>
<a id="line281"></a><span class="lineno">281</span><span class="line">            attribute.accessibility = ASG.PRIVATE</span>
<a id="line282"></a><span class="lineno">282</span><span class="line">        <span class="py-keyword">elif</span> node.name.startswith(<span class="py-string">'_'</span>):</span>
<a id="line283"></a><span class="lineno">283</span><span class="line">            attribute.accessibility = ASG.PROTECTED</span>
<a id="line284"></a><span class="lineno">284</span><span class="line">        self.attributes.append(attribute)</span>
<a id="line285"></a><span class="lineno">285</span><span class="line">        self.types[qname] = ASG.DeclaredTypeId(<span class="py-string">'Python'</span>, attribute.name, attribute)</span>
<a id="line286"></a><span class="lineno">286</span>
<a id="line287"></a><span class="lineno">287</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitAssTuple">visitAssTuple</a>(self, node):</span>
<a id="line288"></a><span class="lineno">288</span>
<a id="line289"></a><span class="lineno">289</span><span class="line">        self.in_ass_tuple = True</span>
<a id="line290"></a><span class="lineno">290</span><span class="line">        <span class="py-keyword">for</span> a <span class="py-keyword">in</span> node.nodes:</span>
<a id="line291"></a><span class="lineno">291</span><span class="line">            self.visit(a)</span>
<a id="line292"></a><span class="lineno">292</span><span class="line">        self.in_ass_tuple = False</span>
<a id="line293"></a><span class="lineno">293</span>
<a id="line294"></a><span class="lineno">294</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitAssAttr">visitAssAttr</a>(self, node):</span>
<a id="line295"></a><span class="lineno">295</span><span class="line">        self.default_visit(node, node.attrname)</span>
<a id="line296"></a><span class="lineno">296</span><span class="line">        <span class="py-keyword">if</span> type(self.scope[-1]) == ASG.Operation:</span>
<a id="line297"></a><span class="lineno">297</span><span class="line">            <span class="py-comment"># We only parse constructors, so look out for</span></span>
<a id="line298"></a><span class="lineno">298</span><span class="line">            <span class="py-comment"># self attributes defined here.</span></span>
<a id="line299"></a><span class="lineno">299</span><span class="line">            <span class="py-comment"># FIXME: There is no reason the 'self' argument actually has to be spelled 'self'.</span></span>
<a id="line300"></a><span class="lineno">300</span><span class="line">            <span class="py-keyword">if</span> self.name[0] == <span class="py-string">'self'</span>:</span>
<a id="line301"></a><span class="lineno">301</span><span class="line">                <span class="py-comment"># FIXME: qualifying variables is ambiguous, since we don't distinguish</span></span>
<a id="line302"></a><span class="lineno">302</span><span class="line">                <span class="py-comment">#        class attributes and object attributes.</span></span>
<a id="line303"></a><span class="lineno">303</span><span class="line">                qname = self.scope[-2].name + self.name[1:]</span>
<a id="line304"></a><span class="lineno">304</span><span class="line">                self.attributes.append(ASG.Variable(self.file, node.lineno,</span>
<a id="line305"></a><span class="lineno">305</span><span class="line">                                                    <span class="py-string">'attribute'</span>, qname, self.any_type, False))</span>
<a id="line306"></a><span class="lineno">306</span>
<a id="line307"></a><span class="lineno">307</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitGetattr">visitGetattr</a>(self, node, suffix):</span>
<a id="line308"></a><span class="lineno">308</span><span class="line">        self.default_visit(node, node.attrname + <span class="py-string">'.'</span> + suffix)</span>
<a id="line309"></a><span class="lineno">309</span>
<a id="line310"></a><span class="lineno">310</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitName">visitName</a>(self, node, suffix=None):</span>
<a id="line311"></a><span class="lineno">311</span>
<a id="line312"></a><span class="lineno">312</span><span class="line">        <span class="py-keyword">if</span> suffix:</span>
<a id="line313"></a><span class="lineno">313</span><span class="line">            self.name = QName((node.name,) + (suffix,))</span>
<a id="line314"></a><span class="lineno">314</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line315"></a><span class="lineno">315</span><span class="line">            self.name = QName((node.name,))</span>
<a id="line316"></a><span class="lineno">316</span>
<a id="line317"></a><span class="lineno">317</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitFunction">visitFunction</a>(self, node):</span>
<a id="line318"></a><span class="lineno">318</span>
<a id="line319"></a><span class="lineno">319</span><span class="line">        <span class="py-keyword">if</span> isinstance(self.scope[-1], ASG.Function):</span>
<a id="line320"></a><span class="lineno">320</span><span class="line">            <span class="py-comment"># Skip local functions.</span></span>
<a id="line321"></a><span class="lineno">321</span><span class="line">            <span class="py-keyword">return</span></span>
<a id="line322"></a><span class="lineno">322</span><span class="line">        qname = QName(self.scope_name() + (node.name,))</span>
<a id="line323"></a><span class="lineno">323</span><span class="line">        <span class="py-keyword">if</span> type(self.scope[-1]) == ASG.Class:</span>
<a id="line324"></a><span class="lineno">324</span><span class="line">            function = ASG.Operation(self.file, node.lineno, <span class="py-string">'method'</span>,</span>
<a id="line325"></a><span class="lineno">325</span><span class="line">                                     [], self.any_type, [], qname, node.name)</span>
<a id="line326"></a><span class="lineno">326</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line327"></a><span class="lineno">327</span><span class="line">            function = ASG.Function(self.file, node.lineno, <span class="py-string">'function'</span>,</span>
<a id="line328"></a><span class="lineno">328</span><span class="line">                                    [], self.any_type, [], qname, node.name)</span>
<a id="line329"></a><span class="lineno">329</span>
<a id="line330"></a><span class="lineno">330</span><span class="line">        <span class="py-comment"># The following attributes are special in that even though they are private they</span></span>
<a id="line331"></a><span class="lineno">331</span><span class="line">        <span class="py-comment"># match publicly accessible operations, so we exclude them from being</span></span>
<a id="line332"></a><span class="lineno">332</span><span class="line">        <span class="py-comment"># marked as private.</span></span>
<a id="line333"></a><span class="lineno">333</span><span class="line">        special_attributes = (<span class="py-string">'__init__'</span>, <span class="py-string">'__str__'</span>, <span class="py-string">'__repr__'</span>, <span class="py-string">'__iter__'</span>, <span class="py-string">'__getitem__'</span>)</span>
<a id="line334"></a><span class="lineno">334</span>
<a id="line335"></a><span class="lineno">335</span><span class="line">        <span class="py-keyword">if</span> node.name.startswith(<span class="py-string">'__'</span>):</span>
<a id="line336"></a><span class="lineno">336</span><span class="line">            <span class="py-keyword">if</span> node.name <span class="py-keyword">not</span> <span class="py-keyword">in</span> special_attributes:</span>
<a id="line337"></a><span class="lineno">337</span><span class="line">                function.accessibility = ASG.PRIVATE</span>
<a id="line338"></a><span class="lineno">338</span><span class="line">        <span class="py-keyword">elif</span> node.name.startswith(<span class="py-string">'_'</span>):</span>
<a id="line339"></a><span class="lineno">339</span><span class="line">            function.accessibility = ASG.PROTECTED</span>
<a id="line340"></a><span class="lineno">340</span>
<a id="line341"></a><span class="lineno">341</span><span class="line">        function.annotations[<span class="py-string">'doc'</span>] = DocString(node.doc <span class="py-keyword">or</span> <span class="py-string">''</span>, self.docformat)</span>
<a id="line342"></a><span class="lineno">342</span><span class="line">        <span class="py-comment"># Given that functions in Python are first-class citizens, should they be</span></span>
<a id="line343"></a><span class="lineno">343</span><span class="line">        <span class="py-comment"># treated like (named) types ?</span></span>
<a id="line344"></a><span class="lineno">344</span><span class="line">        self.types[qname] = ASG.DeclaredTypeId(<span class="py-string">'Python'</span>, function.name, function)</span>
<a id="line345"></a><span class="lineno">345</span>
<a id="line346"></a><span class="lineno">346</span><span class="line">        self.scope.append(function)</span>
<a id="line347"></a><span class="lineno">347</span><span class="line">        self.documentable = function</span>
<a id="line348"></a><span class="lineno">348</span><span class="line">        function.parameters = self.parse_parameter_list(node)</span>
<a id="line349"></a><span class="lineno">349</span><span class="line">        <span class="py-keyword">if</span> node.name == <span class="py-string">'__init__'</span>:</span>
<a id="line350"></a><span class="lineno">350</span><span class="line">            <span class="py-comment"># Only parse constructors, to find member variables</span></span>
<a id="line351"></a><span class="lineno">351</span><span class="line">            self.visit(node.code)</span>
<a id="line352"></a><span class="lineno">352</span><span class="line">        self.scope.pop()</span>
<a id="line353"></a><span class="lineno">353</span><span class="line">        self.scope[-1].declarations.append(function)</span>
<a id="line354"></a><span class="lineno">354</span>
<a id="line355"></a><span class="lineno">355</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#parse_parameter_list">parse_parameter_list</a>(self, node):</span>
<a id="line356"></a><span class="lineno">356</span><span class="line">        parameters = []</span>
<a id="line357"></a><span class="lineno">357</span><span class="line">        special = []</span>
<a id="line358"></a><span class="lineno">358</span><span class="line">        argnames = list(node.argnames)</span>
<a id="line359"></a><span class="lineno">359</span><span class="line">        <span class="py-keyword">if</span> node.kwargs:</span>
<a id="line360"></a><span class="lineno">360</span><span class="line">            special.append(ASG.Parameter(<span class="py-string">'**'</span>, self.any_type, <span class="py-string">''</span>, argnames[-1]))</span>
<a id="line361"></a><span class="lineno">361</span><span class="line">            argnames.pop()</span>
<a id="line362"></a><span class="lineno">362</span><span class="line">        <span class="py-keyword">if</span> node.varargs:</span>
<a id="line363"></a><span class="lineno">363</span><span class="line">            special.append(ASG.Parameter(<span class="py-string">'*'</span>, self.any_type, <span class="py-string">''</span>, argnames[-1]))</span>
<a id="line364"></a><span class="lineno">364</span><span class="line">            argnames.pop()</span>
<a id="line365"></a><span class="lineno">365</span><span class="line">        defaults = list(node.defaults)</span>
<a id="line366"></a><span class="lineno">366</span><span class="line">        defaults = [None] * (len(argnames) - len(defaults)) + defaults</span>
<a id="line367"></a><span class="lineno">367</span><span class="line">        values = self.token_parser.function_parameters(node.lineno)</span>
<a id="line368"></a><span class="lineno">368</span><span class="line">        <span class="py-keyword">for</span> argname, default <span class="py-keyword">in</span> zip(node.argnames, defaults):</span>
<a id="line369"></a><span class="lineno">369</span><span class="line">            <span class="py-keyword">if</span> type(argname) <span class="py-keyword">is</span> tuple:</span>
<a id="line370"></a><span class="lineno">370</span><span class="line">                <span class="py-keyword">for</span> a <span class="py-keyword">in</span> argname:</span>
<a id="line371"></a><span class="lineno">371</span><span class="line">                    <span class="py-comment"># FIXME: It is generally impossible to match tuple parameters</span></span>
<a id="line372"></a><span class="lineno">372</span><span class="line">                    <span class="py-comment"># to defaults individually, we ignore default values for now.</span></span>
<a id="line373"></a><span class="lineno">373</span><span class="line">                    <span class="py-comment"># (We may try to match them, and only leave out those resulting</span></span>
<a id="line374"></a><span class="lineno">374</span><span class="line">                    <span class="py-comment"># from tuple-returning call expressions. But that's for another day.)</span></span>
<a id="line375"></a><span class="lineno">375</span><span class="line">                    parameters.append(ASG.Parameter(<span class="py-string">''</span>, self.any_type, <span class="py-string">''</span>, a))</span>
<a id="line376"></a><span class="lineno">376</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line377"></a><span class="lineno">377</span><span class="line">                parameters.append(ASG.Parameter(<span class="py-string">''</span>, self.any_type, <span class="py-string">''</span>, argname,</span>
<a id="line378"></a><span class="lineno">378</span><span class="line">                                                values[argname]))</span>
<a id="line379"></a><span class="lineno">379</span><span class="line">        <span class="py-keyword">if</span> parameters <span class="py-keyword">or</span> special:</span>
<a id="line380"></a><span class="lineno">380</span><span class="line">            special.reverse()</span>
<a id="line381"></a><span class="lineno">381</span><span class="line">            parameters.extend(special)</span>
<a id="line382"></a><span class="lineno">382</span><span class="line">        <span class="py-keyword">return</span> parameters</span>
<a id="line383"></a><span class="lineno">383</span>
<a id="line384"></a><span class="lineno">384</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitClass">visitClass</a>(self, node):</span>
<a id="line385"></a><span class="lineno">385</span>
<a id="line386"></a><span class="lineno">386</span><span class="line">        <span class="py-keyword">if</span> isinstance(self.scope[-1], ASG.Function):</span>
<a id="line387"></a><span class="lineno">387</span><span class="line">            <span class="py-comment"># Skip local classes.</span></span>
<a id="line388"></a><span class="lineno">388</span><span class="line">            <span class="py-keyword">return</span></span>
<a id="line389"></a><span class="lineno">389</span><span class="line">        bases = []</span>
<a id="line390"></a><span class="lineno">390</span><span class="line">        <span class="py-keyword">for</span> base <span class="py-keyword">in</span> node.bases:</span>
<a id="line391"></a><span class="lineno">391</span><span class="line">            self.visit(base)</span>
<a id="line392"></a><span class="lineno">392</span><span class="line">            <span class="py-comment"># FIXME: This logic is broken !</span></span>
<a id="line393"></a><span class="lineno">393</span><span class="line">            <span class="py-comment">#        It assumes that names are either local or fully qualified.</span></span>
<a id="line394"></a><span class="lineno">394</span><span class="line">            <span class="py-keyword">if</span> len(self.name) == 1 <span class="py-keyword">and</span> self.scope:</span>
<a id="line395"></a><span class="lineno">395</span><span class="line">                <span class="py-comment"># Name is unqualified. Qualify it.</span></span>
<a id="line396"></a><span class="lineno">396</span><span class="line">                base = QName(list(self.scope[-1].name) + list(self.name))</span>
<a id="line397"></a><span class="lineno">397</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line398"></a><span class="lineno">398</span><span class="line">                base = self.name</span>
<a id="line399"></a><span class="lineno">399</span><span class="line">            <span class="py-keyword">if</span> self.types.has_key(base):</span>
<a id="line400"></a><span class="lineno">400</span><span class="line">                base = self.types[base]</span>
<a id="line401"></a><span class="lineno">401</span><span class="line">            <span class="py-keyword">else</span>:</span>
<a id="line402"></a><span class="lineno">402</span><span class="line">                base = ASG.UnknownTypeId(<span class="py-string">'Python'</span>, base)</span>
<a id="line403"></a><span class="lineno">403</span><span class="line">            bases.append(base)</span>
<a id="line404"></a><span class="lineno">404</span><span class="line">        qname = QName(self.scope_name() + (node.name,))</span>
<a id="line405"></a><span class="lineno">405</span><span class="line">        class_ = ASG.Class(self.file, node.lineno, <span class="py-string">'class'</span>, qname)</span>
<a id="line406"></a><span class="lineno">406</span><span class="line">        class_.parents = [ASG.Inheritance(<span class="py-string">''</span>, b, <span class="py-string">''</span>) <span class="py-keyword">for</span> b <span class="py-keyword">in</span> bases]</span>
<a id="line407"></a><span class="lineno">407</span><span class="line">        class_.annotations[<span class="py-string">'doc'</span>] = DocString(node.doc <span class="py-keyword">or</span> <span class="py-string">''</span>, self.docformat)</span>
<a id="line408"></a><span class="lineno">408</span><span class="line">        self.types[qname] = ASG.DeclaredTypeId(<span class="py-string">'Python'</span>, class_.name, class_)</span>
<a id="line409"></a><span class="lineno">409</span><span class="line">        self.scope.append(class_)</span>
<a id="line410"></a><span class="lineno">410</span><span class="line">        self.documentable = class_</span>
<a id="line411"></a><span class="lineno">411</span><span class="line">        self.visit(node.code)</span>
<a id="line412"></a><span class="lineno">412</span><span class="line">        self.scope.pop()</span>
<a id="line413"></a><span class="lineno">413</span><span class="line">        self.scope[-1].declarations.append(class_)</span>
<a id="line414"></a><span class="lineno">414</span>
<a id="line415"></a><span class="lineno">415</span><span class="line">    <span class="py-keyword">def</span> <a href="../../../../Scopes/Synopsis/Parsers/Python/ASGTranslator/ASGTranslator.html#visitGetattr">visitGetattr</a>(self, node, suffix=None):</span>
<a id="line416"></a><span class="lineno">416</span><span class="line">        <span class="py-keyword">if</span> suffix:</span>
<a id="line417"></a><span class="lineno">417</span><span class="line">            name = node.attrname + <span class="py-string">'.'</span> + suffix</span>
<a id="line418"></a><span class="lineno">418</span><span class="line">        <span class="py-keyword">else</span>:</span>
<a id="line419"></a><span class="lineno">419</span><span class="line">            name = node.attrname</span>
<a id="line420"></a><span class="lineno">420</span><span class="line">        self.default_visit(node, name)</span>
<a id="line421"></a><span class="lineno">421</span>
<a id="line422"></a><span class="lineno">422</span>
<a id="line423"></a><span class="lineno">423</span>
</pre>
<div class="logo">Generated on Thu Apr 16 16:27:16 2009 by 
<br/>
<a href="http://synopsis.fresco.org" target="_blank"><img src="../../../../synopsis.png" alt="logo"/> synopsis</a> (version devel)</div>
</body>
</html>