Mercurial > projects > dil
annotate trunk/src/cmd/Statistics.d @ 534:581b3cf3fe8f
Added a new field to statistics generation.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Mon, 17 Dec 2007 22:16:13 +0100 |
parents | 1b897a4536a4 |
children | 0bac0bb506ca |
rev | line source |
---|---|
363 | 1 /++ |
2 Author: Aziz Köksal | |
3 License: GPL3 | |
4 +/ | |
5 module cmd.Statistics; | |
6 import dil.Token; | |
7 import dil.File; | |
8 import dil.Lexer; | |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
364
diff
changeset
|
9 import common; |
363 | 10 |
11 struct Statistics | |
12 { | |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
13 uint whitespaceCount; /// Counter for whitespace characters. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
14 uint wsTokenCount; /// Counter for all whitespace tokens. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
15 uint keywordCount; /// Counter for keywords. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
16 uint identCount; /// Counter for identifier. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
17 uint numberCount; /// Counter for number literals. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
18 uint commentCount; /// Counter for comments. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
19 uint tokenCount; /// Counter for all tokens produced by the Lexer. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
20 uint linesOfCode; /// Number of lines. |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
21 |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
22 void opAddAssign(Statistics s) |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
23 { |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
24 this.whitespaceCount += s.whitespaceCount; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
25 this.wsTokenCount += s.wsTokenCount; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
26 this.keywordCount += s.keywordCount; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
27 this.identCount += s.identCount; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
28 this.numberCount += s.numberCount; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
29 this.commentCount += s.commentCount; |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
30 this.tokenCount += s.tokenCount; |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
31 this.linesOfCode += s.linesOfCode; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
32 } |
363 | 33 } |
34 | |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
35 void execute(string[] filePaths) |
363 | 36 { |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
37 Statistics[] stats; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
38 foreach (filePath; filePaths) |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
39 stats ~= getStatistics(filePath); |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
40 |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
41 Statistics total; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
42 |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
43 foreach (i, ref stat; stats) |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
44 { |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
45 total += stat; |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
46 Stdout.formatln( |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
47 "----\n" |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
48 "File: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
49 "Whitespace character count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
50 "Whitespace token count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
51 "Keyword count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
52 "Identifier count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
53 "Number count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
54 "Comment count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
55 "All tokens count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
56 "Lines of code: {}", |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
57 filePaths[i], |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
58 stat.whitespaceCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
59 stat.wsTokenCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
60 stat.keywordCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
61 stat.identCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
62 stat.numberCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
63 stat.commentCount, |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
64 stat.tokenCount, |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
65 stat.linesOfCode |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
66 ); |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
67 } |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
68 |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
69 if (filePaths.length > 1) |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
70 Stdout.formatln( |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
71 "--------------------------------------------------------------------------------\n" |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
72 "Total of {} files:\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
73 "Whitespace character count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
74 "Whitespace token count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
75 "Keyword count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
76 "Identifier count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
77 "Number count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
78 "Comment count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
79 "All tokens count: {}\n" |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
80 "Lines of code: {}", |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
81 filePaths.length, |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
82 total.whitespaceCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
83 total.wsTokenCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
84 total.keywordCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
85 total.identCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
86 total.numberCount, |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
87 total.commentCount, |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
88 total.tokenCount, |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
89 total.linesOfCode |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
90 ); |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
91 } |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
92 |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
93 Statistics getStatistics(string filePath) |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
94 { |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
95 auto sourceText = loadFile(filePath); |
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
96 auto lx = new Lexer(sourceText, filePath); |
506
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
97 lx.scanAll(); |
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
98 auto token = lx.firstToken(); |
363 | 99 |
100 Statistics stats; | |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
101 // Lexer creates HEAD + Newline, which are not in the source text. |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
102 // No token left behind! |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
103 stats.tokenCount = 2; |
485
ea8c7459f1c4
Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
401
diff
changeset
|
104 stats.linesOfCode = lx.lineNum; |
363 | 105 // Traverse linked list. |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
106 while (1) |
363 | 107 { |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
108 stats.tokenCount += 1; |
363 | 109 // Count whitespace characters |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
110 if (token.ws !is null) |
506
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
111 stats.whitespaceCount += token.start - token.ws; |
363 | 112 |
113 switch (token.type) | |
114 { | |
115 case TOK.Identifier: | |
116 stats.identCount++; | |
117 break; | |
118 case TOK.Comment: | |
119 stats.commentCount++; | |
120 break; | |
121 case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64, | |
122 TOK.Float32, TOK.Float64, TOK.Float80, | |
123 TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80: | |
124 stats.numberCount++; | |
125 break; | |
506
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
126 case TOK.Newline: |
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
127 break; |
363 | 128 default: |
129 if (token.isKeyword) | |
130 stats.keywordCount++; | |
506
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
131 else if (token.isWhitespace) |
1b897a4536a4
Refactored code and fixed a few things in cmd.Statistics.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
485
diff
changeset
|
132 stats.wsTokenCount++; |
363 | 133 } |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
134 |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
135 if (token.next is null) |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
136 break; |
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
137 token = token.next; |
363 | 138 } |
534
581b3cf3fe8f
Added a new field to statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
506
diff
changeset
|
139 assert(token.type == TOK.EOF); |
401
fcdf7ac5ad27
Improved statistics generation.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
391
diff
changeset
|
140 return stats; |
363 | 141 } |