annotate trunk/src/dil/semantic/Module.d @ 719:8f8c9ab3f3ba

Fixed code that finds out a modules FQN. Fixed creation of importPaths in ImportGraph.execute().
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Fri, 01 Feb 2008 15:05:26 +0100
parents 1564e41f454e
children 90668b83ae5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
1 /++
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
2 Author: Aziz Köksal
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
3 License: GPL3
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
4 +/
593
2848ce3becf5 Moved dil.Module to dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 592
diff changeset
5 module dil.semantic.Module;
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
6
580
fa6d3c52757d Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 579
diff changeset
7 import dil.ast.Node;
585
05c375fb2d5c Moved dil.Declarations to dil.ast.Declarations.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 580
diff changeset
8 import dil.ast.Declarations;
578
c769bc239006 Moved Parser.d to new package 'parser'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 576
diff changeset
9 import dil.parser.Parser;
576
0df647660e76 Moved Lexer.d to new package 'lexer'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 570
diff changeset
10 import dil.lexer.Lexer;
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
11 import dil.File;
589
de365ddcfbd4 Moved dil.Symbol to dil.semantic.Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 585
diff changeset
12 import dil.semantic.Symbol;
590
641041912670 Moved dil.Symbols to dil.semantic.Symbols.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 589
diff changeset
13 import dil.semantic.Symbols;
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
14 import dil.Information;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
15 import tango.io.FilePath;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
16 import tango.io.FileConst;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
17 import common;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
18
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
19 alias FileConst.PathSeparatorChar dirSep;
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
20
560
709e223a8eb9 Added code related to symbols.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 532
diff changeset
21 class Module : ScopeSymbol
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
22 {
370
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
23 string filePath; /// Path to the source file.
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
24 string moduleFQN; /// Fully qualified name of the module. E.g. dil.ast.Node
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
25 string packageName; /// E.g. dil.ast
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
26 string moduleName; /// E.g. Node
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
27
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
28 CompoundDeclaration root; /// The root of the parse tree.
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
29 ImportDeclaration[] imports; /// ImportDeclarations found in this file.
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
30 ModuleDeclaration moduleDecl; /// The optional ModuleDeclaration in this file.
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
31 Parser parser; /// The parser used to parse this file.
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
32
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
33 Module[] modules;
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
34
532
50e64bab9c7a Renamed InformationManager to InfoManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 520
diff changeset
35 InfoManager infoMan;
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
36
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
37 this()
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
38 {
683
1ae72234db26 Implemented some methods in SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 680
diff changeset
39 super(SYM.Module, null, null);
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
40 }
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
41
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
42 this(string filePath, InfoManager infoMan = null)
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
43 {
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
44 this();
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
45 this.filePath = filePath;
520
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
46 this.infoMan = infoMan;
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
47 }
f203c5248d0b Added 'compile' command.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 516
diff changeset
48
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
49 void parse()
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
50 {
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
51 if (this.parser is null)
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
52 this.parser = new Parser(loadFile(filePath), filePath, infoMan);
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
53
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
54 this.root = parser.start();
719
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
55 this.imports = parser.imports;
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
56
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
57 if (root.children.length)
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
58 {
673
64fec49651cf Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 649
diff changeset
59 // moduleDecl will be null if first node isn't a ModuleDeclaration.
64fec49651cf Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 649
diff changeset
60 this.moduleDecl = root.children[0].Is!(ModuleDeclaration);
719
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
61 if (this.moduleDecl)
370
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
62 this.setFQN(moduleDecl.getFQN());
719
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
63 }
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
64
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
65 if (!this.moduleFQN.length)
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
66 {
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
67 // Take base name of file path as module name.
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
68 auto str = (new FilePath(filePath)).name();
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
69 if (!Lexer.isReservedIdentifier(str))
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
70 this.moduleFQN = this.moduleName = str;
365
ed67acc82268 - Added option includes to config.d.
aziz
parents: 364
diff changeset
71 else
719
8f8c9ab3f3ba Fixed code that finds out a modules FQN.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 698
diff changeset
72 throw new Exception("'"~str~"' is not a valid module name");
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
73 }
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
74 }
366
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
75
563
c838ed7f2ac9 Added 'override' to some methods.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 560
diff changeset
76 /// Returns true if there are errors in the source file.
515
7cb97346bc6f Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 510
diff changeset
77 bool hasErrors()
7cb97346bc6f Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 510
diff changeset
78 {
619
933cd8d24467 Renamed Parser.lx to Parser.lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 593
diff changeset
79 return parser.errors.length || parser.lexer.errors.length;
515
7cb97346bc6f Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 510
diff changeset
80 }
7cb97346bc6f Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 510
diff changeset
81
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
82 string[] getImportPaths()
366
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
83 {
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
84 string[] result;
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
85 foreach (import_; imports)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 370
diff changeset
86 result ~= import_.getModuleFQNs(dirSep);
366
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
87 return result;
dcbd3bf9bf74 - Added command importgraph/igraph to main.d.
aziz
parents: 365
diff changeset
88 }
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
89
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
90 /// Returns the fully qualified name of this module.
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
91 /// E.g.: dil.ast.Node
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
92 string getFQN()
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
93 {
370
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
94 return moduleFQN;
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
95 }
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
96
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
97 void setFQN(string moduleFQN)
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
98 {
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
99 uint i = moduleFQN.length;
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
100 if (i != 0) // Don't decrement if string has zero length.
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
101 i--;
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
102 // Find last dot.
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
103 for (; i != 0 && moduleFQN[i] != '.'; i--)
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
104 {}
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
105 this.moduleFQN = moduleFQN;
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
106 this.packageName = moduleFQN[0..i];
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
107 this.moduleName = moduleFQN[(i == 0 ? 0 : i+1) .. $];
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
108 }
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
109
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
110 /// Returns e.g. the FQN with slashes instead of dots.
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
111 /// E.g.: dil/ast/Node
370
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
112 string getFQNPath()
ae4afb66768f - Renamed findModule() to findModulePath().
aziz
parents: 368
diff changeset
113 {
698
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
114 string FQNPath = moduleFQN.dup;
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
115 foreach (i, c; FQNPath)
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
116 if (c == '.')
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
117 FQNPath[i] = dirSep;
1564e41f454e Revised modules cmd.ImportGraph and dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 683
diff changeset
118 return FQNPath;
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 366
diff changeset
119 }
364
1059295c2727 - Every command module has an execute method now.
aziz
parents:
diff changeset
120 }