bixbite 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.markdown +49 -0
- data/VERSION +1 -0
- data/bin/bixbite +73 -0
- data/lib/bixbite.rb +13 -0
- data/lib/bixbite/command.rb +14 -0
- data/lib/bixbite/create.rb +76 -0
- data/template/Rakefile +25 -0
- data/template/assets/bixbite/Rakefile.rb +297 -0
- data/template/assets/naturaldocs/NaturalDocs/Config/Languages.txt +286 -0
- data/template/assets/naturaldocs/NaturalDocs/Config/Topics.txt +382 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/customizinglanguages.html +52 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/customizingtopics.html +74 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting.html +58 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting/reference.html +146 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting/walkthrough.html +180 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/example/Default.css +528 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/example/NaturalDocs.js +204 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/examples.css +90 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/background.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/leftside.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/logo.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbody.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbodybg.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overleftmargin.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenu.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenubg.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/rightside.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/logo.gif +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/about.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/background.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomleft.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomright.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/community.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/customizing.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/using.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/index.html +9 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/javascript/BrowserStyles.js +77 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/javascript/PNGHandling.js +72 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/keywords.html +38 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/languages.html +32 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/menu.html +79 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/output.html +84 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/running.html +40 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/styles.css +290 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/styles.html +52 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/troubleshooting.html +18 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/CSSGuide.txt +947 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/File Parsing.txt +83 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/HTMLTestCases.pm +269 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/Languages.txt +107 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/NDMarkup.txt +91 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/Symbol Management.txt +59 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/images/Logo.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/JavaScript/NaturalDocs.js +836 -0
- data/template/assets/naturaldocs/NaturalDocs/License-GPL.txt +341 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/BinaryFile.pm +294 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder.pm +280 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/Base.pm +348 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/FramedHTML.pm +345 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTML.pm +398 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTMLBase.pm +3693 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy.pm +860 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/Class.pm +412 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/File.pm +157 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ConfigFile.pm +497 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Constants.pm +165 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/DefineMembers.pm +100 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Error.pm +305 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/File.pm +540 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable.pm +383 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/Reference.pm +44 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/String.pm +110 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages.pm +1475 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/ActionScript.pm +1473 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Ada.pm +38 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced.pm +828 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/Scope.pm +95 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/ScopeChange.pm +70 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Base.pm +832 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/CSharp.pm +1484 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/PLSQL.pm +319 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Pascal.pm +143 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Perl.pm +1370 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype.pm +92 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype/Parameter.pm +87 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Simple.pm +503 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Tcl.pm +219 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu.pm +3406 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu/Entry.pm +201 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/NDMarkup.pm +76 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser.pm +1331 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/JavaDoc.pm +464 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/Native.pm +1060 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/ParsedTopic.pm +253 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project.pm +1402 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/ImageFile.pm +160 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/SourceFile.pm +113 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ReferenceString.pm +334 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings.pm +1418 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings/BuildTarget.pm +66 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB.pm +678 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Extension.pm +84 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/File.pm +129 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Item.pm +201 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/ItemDefinition.pm +45 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/WatchedFileDefinitions.pm +159 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/StatusMessage.pm +102 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolString.pm +212 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable.pm +1984 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/File.pm +186 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/IndexElement.pm +522 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Reference.pm +273 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/ReferenceTarget.pm +97 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Symbol.pm +428 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/SymbolDefinition.pm +96 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics.pm +1319 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics/Type.pm +151 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Version.pm +384 -0
- data/template/assets/naturaldocs/NaturalDocs/NaturalDocs +400 -0
- data/template/assets/naturaldocs/NaturalDocs/NaturalDocs.bat +17 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Default.css +767 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Roman.css +765 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Small.css +763 -0
- data/template/assets/utilities/pngout +0 -0
- data/template/deploy/public_html/.htaccess +0 -0
- data/template/documentation/js/.htaccess +0 -0
- data/template/src/html/.htaccess +76 -0
- data/template/src/html/css/cmn/global.css +96 -0
- data/template/src/html/css/cmn/ie.css +15 -0
- data/template/src/html/css/cmn/ie6.css +15 -0
- data/template/src/html/images/cmn/.htaccess +0 -0
- data/template/src/html/images/tmp/.htaccess +0 -0
- data/template/src/html/includes/debug.inc +5 -0
- data/template/src/html/includes/footer.inc +52 -0
- data/template/src/html/includes/header.inc +61 -0
- data/template/src/html/includes/html.inc +3 -0
- data/template/src/html/includes/namespace.inc +19 -0
- data/template/src/html/includes/page.inc +151 -0
- data/template/src/html/index.html +35 -0
- data/template/src/html/js/cmn/bootstrap.js +74 -0
- data/template/src/html/js/cmn/global.js +142 -0
- data/template/src/html/js/cmn/lib/LAB.js +348 -0
- data/template/src/html/min/.htaccess +4 -0
- data/template/src/html/min/MinifyCLI.php +19 -0
- data/template/src/html/min/README.txt +132 -0
- data/template/src/html/min/builder/_index.js +242 -0
- data/template/src/html/min/builder/bm.js +36 -0
- data/template/src/html/min/builder/index.php +182 -0
- data/template/src/html/min/builder/ocCheck.php +36 -0
- data/template/src/html/min/builder/rewriteTest.js +1 -0
- data/template/src/html/min/config.php +187 -0
- data/template/src/html/min/groupsConfig.php +34 -0
- data/template/src/html/min/index.php +66 -0
- data/template/src/html/min/lib/FirePHP.php +1370 -0
- data/template/src/html/min/lib/HTTP/ConditionalGet.php +348 -0
- data/template/src/html/min/lib/HTTP/Encoder.php +326 -0
- data/template/src/html/min/lib/JSMin.php +314 -0
- data/template/src/html/min/lib/JSMinPlus.php +1872 -0
- data/template/src/html/min/lib/Minify.php +532 -0
- data/template/src/html/min/lib/Minify/Build.php +103 -0
- data/template/src/html/min/lib/Minify/CSS.php +83 -0
- data/template/src/html/min/lib/Minify/CSS/Compressor.php +250 -0
- data/template/src/html/min/lib/Minify/CSS/UriRewriter.php +270 -0
- data/template/src/html/min/lib/Minify/Cache/APC.php +130 -0
- data/template/src/html/min/lib/Minify/Cache/File.php +125 -0
- data/template/src/html/min/lib/Minify/Cache/Memcache.php +137 -0
- data/template/src/html/min/lib/Minify/ClosureCompiler.php +85 -0
- data/template/src/html/min/lib/Minify/CommentPreserver.php +90 -0
- data/template/src/html/min/lib/Minify/Controller/Base.php +202 -0
- data/template/src/html/min/lib/Minify/Controller/Files.php +78 -0
- data/template/src/html/min/lib/Minify/Controller/Groups.php +94 -0
- data/template/src/html/min/lib/Minify/Controller/MinApp.php +132 -0
- data/template/src/html/min/lib/Minify/Controller/Page.php +82 -0
- data/template/src/html/min/lib/Minify/Controller/Version1.php +118 -0
- data/template/src/html/min/lib/Minify/HTML.php +245 -0
- data/template/src/html/min/lib/Minify/ImportProcessor.php +157 -0
- data/template/src/html/min/lib/Minify/Lines.php +131 -0
- data/template/src/html/min/lib/Minify/Logger.php +45 -0
- data/template/src/html/min/lib/Minify/Packer.php +37 -0
- data/template/src/html/min/lib/Minify/Source.php +187 -0
- data/template/src/html/min/lib/Minify/YUICompressor.php +139 -0
- data/template/src/html/min/lib/Solar/Dir.php +199 -0
- data/template/src/html/min/lib/closure-compiler.jar +0 -0
- data/template/src/html/min/lib/yuicompressor-2.4.2.jar +0 -0
- data/template/src/html/min/utils.php +90 -0
- data/template/src/templates/css/template.css +7 -0
- data/template/src/templates/js/template.js +72 -0
- data/template/src/templates/template.html +18 -0
- data/template/src/yaml/config.yml +46 -0
- data/template/src/yaml/deploy.yml +35 -0
- data/test/bixbite_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +278 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
###############################################################################
|
2
|
+
#
|
3
|
+
# Class: NaturalDocs::Languages::Ada
|
4
|
+
#
|
5
|
+
###############################################################################
|
6
|
+
#
|
7
|
+
# A subclass to handle the language variations of Ada
|
8
|
+
#
|
9
|
+
###############################################################################
|
10
|
+
|
11
|
+
# This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure
|
12
|
+
# Natural Docs is licensed under the GPL
|
13
|
+
|
14
|
+
use strict;
|
15
|
+
use integer;
|
16
|
+
|
17
|
+
package NaturalDocs::Languages::Ada;
|
18
|
+
|
19
|
+
use base 'NaturalDocs::Languages::Simple';
|
20
|
+
|
21
|
+
|
22
|
+
#
|
23
|
+
# Function: ParseParameterLine
|
24
|
+
# Overridden because Ada uses Pascal-style parameters
|
25
|
+
#
|
26
|
+
sub ParseParameterLine #(...)
|
27
|
+
{
|
28
|
+
my ($self, @params) = @_;
|
29
|
+
return $self->SUPER::ParsePascalParameterLine(@params);
|
30
|
+
};
|
31
|
+
|
32
|
+
sub TypeBeforeParameter
|
33
|
+
{
|
34
|
+
return 0;
|
35
|
+
};
|
36
|
+
|
37
|
+
|
38
|
+
1;
|
@@ -0,0 +1,828 @@
|
|
1
|
+
###############################################################################
|
2
|
+
#
|
3
|
+
# Class: NaturalDocs::Languages::Advanced
|
4
|
+
#
|
5
|
+
###############################################################################
|
6
|
+
#
|
7
|
+
# The base class for all languages that have full support in Natural Docs. Each one will have a custom parser capable
|
8
|
+
# of documenting undocumented aspects of the code.
|
9
|
+
#
|
10
|
+
###############################################################################
|
11
|
+
|
12
|
+
# This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure
|
13
|
+
# Natural Docs is licensed under the GPL
|
14
|
+
|
15
|
+
use strict;
|
16
|
+
use integer;
|
17
|
+
|
18
|
+
use NaturalDocs::Languages::Advanced::Scope;
|
19
|
+
use NaturalDocs::Languages::Advanced::ScopeChange;
|
20
|
+
|
21
|
+
package NaturalDocs::Languages::Advanced;
|
22
|
+
|
23
|
+
use base 'NaturalDocs::Languages::Base';
|
24
|
+
|
25
|
+
|
26
|
+
#############################################################################
|
27
|
+
# Group: Implementation
|
28
|
+
|
29
|
+
#
|
30
|
+
# Constants: Members
|
31
|
+
#
|
32
|
+
# The class is implemented as a blessed arrayref. The following constants are used as indexes.
|
33
|
+
#
|
34
|
+
# TOKENS - An arrayref of tokens used in all the <Parsing Functions>.
|
35
|
+
# SCOPE_STACK - An arrayref of <NaturalDocs::Languages::Advanced::Scope> objects serving as a scope stack for parsing.
|
36
|
+
# There will always be one available, with a symbol of undef, for the top level.
|
37
|
+
# SCOPE_RECORD - An arrayref of <NaturalDocs::Languages::Advanced::ScopeChange> objects, as generated by the scope
|
38
|
+
# stack. If there is more than one change per line, only the last is stored.
|
39
|
+
# AUTO_TOPICS - An arrayref of <NaturalDocs::Parser::ParsedTopics> generated automatically from the code.
|
40
|
+
#
|
41
|
+
use NaturalDocs::DefineMembers 'TOKENS', 'SCOPE_STACK', 'SCOPE_RECORD', 'AUTO_TOPICS';
|
42
|
+
|
43
|
+
|
44
|
+
#############################################################################
|
45
|
+
# Group: Functions
|
46
|
+
|
47
|
+
#
|
48
|
+
# Function: New
|
49
|
+
#
|
50
|
+
# Creates and returns a new object.
|
51
|
+
#
|
52
|
+
# Parameters:
|
53
|
+
#
|
54
|
+
# name - The name of the language.
|
55
|
+
#
|
56
|
+
sub New #(name)
|
57
|
+
{
|
58
|
+
my ($package, @parameters) = @_;
|
59
|
+
|
60
|
+
my $object = $package->SUPER::New(@parameters);
|
61
|
+
$object->[TOKENS] = undef;
|
62
|
+
$object->[SCOPE_STACK] = undef;
|
63
|
+
$object->[SCOPE_RECORD] = undef;
|
64
|
+
|
65
|
+
return $object;
|
66
|
+
};
|
67
|
+
|
68
|
+
|
69
|
+
# Function: Tokens
|
70
|
+
# Returns the tokens found by <ParseForCommentsAndTokens()>.
|
71
|
+
sub Tokens
|
72
|
+
{ return $_[0]->[TOKENS]; };
|
73
|
+
|
74
|
+
# Function: SetTokens
|
75
|
+
# Replaces the tokens.
|
76
|
+
sub SetTokens #(tokens)
|
77
|
+
{ $_[0]->[TOKENS] = $_[1]; };
|
78
|
+
|
79
|
+
# Function: ClearTokens
|
80
|
+
# Resets the token list. You may want to do this after parsing is over to save memory.
|
81
|
+
sub ClearTokens
|
82
|
+
{ $_[0]->[TOKENS] = undef; };
|
83
|
+
|
84
|
+
# Function: AutoTopics
|
85
|
+
# Returns the arrayref of automatically generated topics, or undef if none.
|
86
|
+
sub AutoTopics
|
87
|
+
{ return $_[0]->[AUTO_TOPICS]; };
|
88
|
+
|
89
|
+
# Function: AddAutoTopic
|
90
|
+
# Adds a <NaturalDocs::Parser::ParsedTopic> to <AutoTopics()>.
|
91
|
+
sub AddAutoTopic #(topic)
|
92
|
+
{
|
93
|
+
my ($self, $topic) = @_;
|
94
|
+
if (!defined $self->[AUTO_TOPICS])
|
95
|
+
{ $self->[AUTO_TOPICS] = [ ]; };
|
96
|
+
push @{$self->[AUTO_TOPICS]}, $topic;
|
97
|
+
};
|
98
|
+
|
99
|
+
# Function: ClearAutoTopics
|
100
|
+
# Resets the automatic topic list. Not necessary if you call <ParseForCommentsAndTokens()>.
|
101
|
+
sub ClearAutoTopics
|
102
|
+
{ $_[0]->[AUTO_TOPICS] = undef; };
|
103
|
+
|
104
|
+
# Function: ScopeRecord
|
105
|
+
# Returns an arrayref of <NaturalDocs::Languages::Advanced::ScopeChange> objects describing how and when the scope
|
106
|
+
# changed thoughout the file. There will always be at least one entry, which will be for line 1 and undef as the scope.
|
107
|
+
sub ScopeRecord
|
108
|
+
{ return $_[0]->[SCOPE_RECORD]; };
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
###############################################################################
|
113
|
+
#
|
114
|
+
# Group: Parsing Functions
|
115
|
+
#
|
116
|
+
# These functions are good general language building blocks. Use them to create your language-specific parser.
|
117
|
+
#
|
118
|
+
# All functions work on <Tokens()> and assume it is set by <ParseForCommentsAndTokens()>.
|
119
|
+
#
|
120
|
+
|
121
|
+
|
122
|
+
#
|
123
|
+
# Function: ParseForCommentsAndTokens
|
124
|
+
#
|
125
|
+
# Loads the passed file, sends all appropriate comments to <NaturalDocs::Parser->OnComment()>, and breaks the rest into
|
126
|
+
# an arrayref of tokens. Tokens are defined as
|
127
|
+
#
|
128
|
+
# - All consecutive alphanumeric and underscore characters.
|
129
|
+
# - All consecutive whitespace.
|
130
|
+
# - A single line break. It will always be "\n"; you don't have to worry about platform differences.
|
131
|
+
# - A single character not included above, which is usually a symbol. Multiple consecutive ones each get their own token.
|
132
|
+
#
|
133
|
+
# The result will be placed in <Tokens()>.
|
134
|
+
#
|
135
|
+
# Parameters:
|
136
|
+
#
|
137
|
+
# sourceFile - The source <FileName> to load and parse.
|
138
|
+
# lineCommentSymbols - An arrayref of symbols that designate line comments, or undef if none.
|
139
|
+
# blockCommentSymbols - An arrayref of symbol pairs that designate multiline comments, or undef if none. Symbol pairs are
|
140
|
+
# designated as two consecutive array entries, the opening symbol appearing first.
|
141
|
+
# javadocLineCommentSymbols - An arrayref of symbols that designate the start of a JavaDoc comment, or undef if none.
|
142
|
+
# javadocBlockCommentSymbols - An arrayref of symbol pairs that designate multiline JavaDoc comments, or undef if none.
|
143
|
+
#
|
144
|
+
# Notes:
|
145
|
+
#
|
146
|
+
# - This function automatically calls <ClearAutoTopics()> and <ClearScopeStack()>. You only need to call those functions
|
147
|
+
# manually if you override this one.
|
148
|
+
# - To save parsing time, all comment lines sent to <NaturalDocs::Parser->OnComment()> will be replaced with blank lines
|
149
|
+
# in <Tokens()>. It's all the same to most languages.
|
150
|
+
#
|
151
|
+
sub ParseForCommentsAndTokens #(FileName sourceFile, string[] lineCommentSymbols, string[] blockCommentSymbols, string[] javadocLineCommentSymbols, string[] javadocBlockCommentSymbols)
|
152
|
+
{
|
153
|
+
my ($self, $sourceFile, $lineCommentSymbols, $blockCommentSymbols,
|
154
|
+
$javadocLineCommentSymbols, $javadocBlockCommentSymbols) = @_;
|
155
|
+
|
156
|
+
open(SOURCEFILEHANDLE, '<' . $sourceFile)
|
157
|
+
or die "Couldn't open input file " . $sourceFile . "\n";
|
158
|
+
|
159
|
+
my $tokens = [ ];
|
160
|
+
$self->SetTokens($tokens);
|
161
|
+
|
162
|
+
# For convenience.
|
163
|
+
$self->ClearAutoTopics();
|
164
|
+
$self->ClearScopeStack();
|
165
|
+
|
166
|
+
|
167
|
+
# Load and preprocess the file
|
168
|
+
|
169
|
+
my @lines;
|
170
|
+
my $line = <SOURCEFILEHANDLE>;
|
171
|
+
|
172
|
+
# On the very first line, remove a Unicode BOM if present. Information on it available at:
|
173
|
+
# http://www.unicode.org/faq/utf_bom.html#BOM
|
174
|
+
$line =~ s/^\xEF\xBB\xBF//;
|
175
|
+
|
176
|
+
while (defined $line)
|
177
|
+
{
|
178
|
+
::XChomp(\$line);
|
179
|
+
push @lines, $line;
|
180
|
+
|
181
|
+
$line = <SOURCEFILEHANDLE>;
|
182
|
+
};
|
183
|
+
|
184
|
+
close(SOURCEFILEHANDLE);
|
185
|
+
|
186
|
+
$self->PreprocessFile(\@lines);
|
187
|
+
|
188
|
+
|
189
|
+
# Go through the file
|
190
|
+
|
191
|
+
my $lineIndex = 0;
|
192
|
+
|
193
|
+
while ($lineIndex < scalar @lines)
|
194
|
+
{
|
195
|
+
$line = $lines[$lineIndex];
|
196
|
+
|
197
|
+
my @commentLines;
|
198
|
+
my $commentLineNumber;
|
199
|
+
my $isJavaDoc;
|
200
|
+
my $closingSymbol;
|
201
|
+
|
202
|
+
|
203
|
+
# Retrieve single line comments. This leaves $lineIndex at the next line.
|
204
|
+
|
205
|
+
if ( ($isJavaDoc = $self->StripOpeningJavaDocSymbols(\$line, $javadocLineCommentSymbols)) ||
|
206
|
+
$self->StripOpeningSymbols(\$line, $lineCommentSymbols))
|
207
|
+
{
|
208
|
+
$commentLineNumber = $lineIndex + 1;
|
209
|
+
|
210
|
+
do
|
211
|
+
{
|
212
|
+
push @commentLines, $line;
|
213
|
+
push @$tokens, "\n";
|
214
|
+
|
215
|
+
$lineIndex++;
|
216
|
+
|
217
|
+
if ($lineIndex >= scalar @lines)
|
218
|
+
{ goto EndDo; };
|
219
|
+
|
220
|
+
$line = $lines[$lineIndex];
|
221
|
+
}
|
222
|
+
while ($self->StripOpeningSymbols(\$line, $lineCommentSymbols));
|
223
|
+
|
224
|
+
EndDo: # I hate Perl sometimes.
|
225
|
+
}
|
226
|
+
|
227
|
+
|
228
|
+
# Retrieve multiline comments. This leaves $lineIndex at the next line.
|
229
|
+
|
230
|
+
elsif ( ($isJavaDoc = $self->StripOpeningJavaDocBlockSymbols(\$line, $javadocBlockCommentSymbols)) ||
|
231
|
+
($closingSymbol = $self->StripOpeningBlockSymbols(\$line, $blockCommentSymbols)) )
|
232
|
+
{
|
233
|
+
$commentLineNumber = $lineIndex + 1;
|
234
|
+
|
235
|
+
if ($isJavaDoc)
|
236
|
+
{ $closingSymbol = $isJavaDoc; };
|
237
|
+
|
238
|
+
# Note that it is possible for a multiline comment to start correctly but not end so. We want those comments to stay in
|
239
|
+
# the code. For example, look at this prototype with this splint annotation:
|
240
|
+
#
|
241
|
+
# int get_array(integer_t id,
|
242
|
+
# /*@out@*/ array_t array);
|
243
|
+
#
|
244
|
+
# The annotation starts correctly but doesn't end so because it is followed by code on the same line.
|
245
|
+
|
246
|
+
my ($lineRemainder, $isMultiLine);
|
247
|
+
|
248
|
+
for (;;)
|
249
|
+
{
|
250
|
+
$lineRemainder = $self->StripClosingSymbol(\$line, $closingSymbol);
|
251
|
+
|
252
|
+
push @commentLines, $line;
|
253
|
+
|
254
|
+
# If we found an end comment symbol...
|
255
|
+
if (defined $lineRemainder)
|
256
|
+
{ last; };
|
257
|
+
|
258
|
+
push @$tokens, "\n";
|
259
|
+
$lineIndex++;
|
260
|
+
$isMultiLine = 1;
|
261
|
+
|
262
|
+
if ($lineIndex >= scalar @lines)
|
263
|
+
{ last; };
|
264
|
+
|
265
|
+
$line = $lines[$lineIndex];
|
266
|
+
};
|
267
|
+
|
268
|
+
if ($lineRemainder !~ /^[ \t]*$/)
|
269
|
+
{
|
270
|
+
# If there was something past the closing symbol this wasn't an acceptable comment.
|
271
|
+
|
272
|
+
if ($isMultiLine)
|
273
|
+
{ $self->TokenizeLine($lineRemainder); }
|
274
|
+
else
|
275
|
+
{
|
276
|
+
# We go back to the original line if it wasn't a multiline comment because we want the comment to stay in the
|
277
|
+
# code. Otherwise the /*@out@*/ from the example would be removed.
|
278
|
+
$self->TokenizeLine($lines[$lineIndex]);
|
279
|
+
};
|
280
|
+
|
281
|
+
@commentLines = ( );
|
282
|
+
}
|
283
|
+
else
|
284
|
+
{
|
285
|
+
push @$tokens, "\n";
|
286
|
+
};
|
287
|
+
|
288
|
+
$lineIndex++;
|
289
|
+
}
|
290
|
+
|
291
|
+
|
292
|
+
# Otherwise just add it to the code.
|
293
|
+
|
294
|
+
else
|
295
|
+
{
|
296
|
+
$self->TokenizeLine($line);
|
297
|
+
$lineIndex++;
|
298
|
+
};
|
299
|
+
|
300
|
+
|
301
|
+
# If there were comments, send them to Parser->OnComment().
|
302
|
+
|
303
|
+
if (scalar @commentLines)
|
304
|
+
{
|
305
|
+
NaturalDocs::Parser->OnComment(\@commentLines, $commentLineNumber, $isJavaDoc);
|
306
|
+
@commentLines = ( );
|
307
|
+
$isJavaDoc = undef;
|
308
|
+
};
|
309
|
+
|
310
|
+
# $lineIndex was incremented by the individual code paths above.
|
311
|
+
|
312
|
+
}; # while ($lineIndex < scalar @lines)
|
313
|
+
};
|
314
|
+
|
315
|
+
|
316
|
+
#
|
317
|
+
# Function: PreprocessFile
|
318
|
+
#
|
319
|
+
# An overridable function if you'd like to preprocess the file before it goes into <ParseForCommentsAndTokens()>.
|
320
|
+
#
|
321
|
+
# Parameters:
|
322
|
+
#
|
323
|
+
# lines - An arrayref to the file's lines. Each line has its line break stripped off, but is otherwise untouched.
|
324
|
+
#
|
325
|
+
sub PreprocessFile #(lines)
|
326
|
+
{
|
327
|
+
};
|
328
|
+
|
329
|
+
|
330
|
+
#
|
331
|
+
# Function: TokenizeLine
|
332
|
+
#
|
333
|
+
# Converts the passed line to tokens as described in <ParseForCommentsAndTokens> and adds them to <Tokens()>. Also
|
334
|
+
# adds a line break token after it.
|
335
|
+
#
|
336
|
+
sub TokenizeLine #(line)
|
337
|
+
{
|
338
|
+
my ($self, $line) = @_;
|
339
|
+
push @{$self->Tokens()}, $line =~ /(\w+|[ \t]+|.)/g, "\n";
|
340
|
+
};
|
341
|
+
|
342
|
+
|
343
|
+
#
|
344
|
+
# Function: TryToSkipString
|
345
|
+
#
|
346
|
+
# If the position is on a string delimiter, moves the position to the token following the closing delimiter, or past the end of the
|
347
|
+
# tokens if there is none. Assumes all other characters are allowed in the string, the delimiter itself is allowed if it's preceded by
|
348
|
+
# a backslash, and line breaks are allowed in the string.
|
349
|
+
#
|
350
|
+
# Parameters:
|
351
|
+
#
|
352
|
+
# indexRef - A reference to the position's index into <Tokens()>.
|
353
|
+
# lineNumberRef - A reference to the position's line number.
|
354
|
+
# openingDelimiter - The opening string delimiter, such as a quote or an apostrophe.
|
355
|
+
# closingDelimiter - The closing string delimiter, if different. If not defined, assumes the same as openingDelimiter.
|
356
|
+
# startContentIndexRef - A reference to a variable in which to store the index of the first token of the string's content.
|
357
|
+
# May be undef.
|
358
|
+
# endContentIndexRef - A reference to a variable in which to store the index of the end of the string's content, which is one
|
359
|
+
# past the last index of content. May be undef.
|
360
|
+
#
|
361
|
+
# Returns:
|
362
|
+
#
|
363
|
+
# Whether the position was on the passed delimiter or not. The index, line number, and content index ref variables will be
|
364
|
+
# updated only if true.
|
365
|
+
#
|
366
|
+
sub TryToSkipString #(indexRef, lineNumberRef, openingDelimiter, closingDelimiter, startContentIndexRef, endContentIndexRef)
|
367
|
+
{
|
368
|
+
my ($self, $index, $lineNumber, $openingDelimiter, $closingDelimiter, $startContentIndexRef, $endContentIndexRef) = @_;
|
369
|
+
my $tokens = $self->Tokens();
|
370
|
+
|
371
|
+
if (!defined $closingDelimiter)
|
372
|
+
{ $closingDelimiter = $openingDelimiter; };
|
373
|
+
|
374
|
+
if ($tokens->[$$index] ne $openingDelimiter)
|
375
|
+
{ return undef; };
|
376
|
+
|
377
|
+
|
378
|
+
$$index++;
|
379
|
+
if (defined $startContentIndexRef)
|
380
|
+
{ $$startContentIndexRef = $$index; };
|
381
|
+
|
382
|
+
while ($$index < scalar @$tokens)
|
383
|
+
{
|
384
|
+
if ($tokens->[$$index] eq "\\")
|
385
|
+
{
|
386
|
+
# Skip the token after it.
|
387
|
+
$$index += 2;
|
388
|
+
}
|
389
|
+
elsif ($tokens->[$$index] eq "\n")
|
390
|
+
{
|
391
|
+
$$lineNumber++;
|
392
|
+
$$index++;
|
393
|
+
}
|
394
|
+
elsif ($tokens->[$$index] eq $closingDelimiter)
|
395
|
+
{
|
396
|
+
if (defined $endContentIndexRef)
|
397
|
+
{ $$endContentIndexRef = $$index; };
|
398
|
+
|
399
|
+
$$index++;
|
400
|
+
last;
|
401
|
+
}
|
402
|
+
else
|
403
|
+
{
|
404
|
+
$$index++;
|
405
|
+
};
|
406
|
+
};
|
407
|
+
|
408
|
+
if ($$index >= scalar @$tokens && defined $endContentIndexRef)
|
409
|
+
{ $$endContentIndexRef = scalar @$tokens; };
|
410
|
+
|
411
|
+
return 1;
|
412
|
+
};
|
413
|
+
|
414
|
+
|
415
|
+
#
|
416
|
+
# Function: SkipRestOfLine
|
417
|
+
#
|
418
|
+
# Moves the position to the token following the next line break, or past the end of the tokens array if there is none. Useful for
|
419
|
+
# line comments.
|
420
|
+
#
|
421
|
+
# Note that it skips blindly. It assumes there cannot be anything of interest, such as a string delimiter, between the position
|
422
|
+
# and the end of the line.
|
423
|
+
#
|
424
|
+
# Parameters:
|
425
|
+
#
|
426
|
+
# indexRef - A reference to the position's index into <Tokens()>.
|
427
|
+
# lineNumberRef - A reference to the position's line number.
|
428
|
+
|
429
|
+
sub SkipRestOfLine #(indexRef, lineNumberRef)
|
430
|
+
{
|
431
|
+
my ($self, $index, $lineNumber) = @_;
|
432
|
+
my $tokens = $self->Tokens();
|
433
|
+
|
434
|
+
while ($$index < scalar @$tokens)
|
435
|
+
{
|
436
|
+
if ($tokens->[$$index] eq "\n")
|
437
|
+
{
|
438
|
+
$$lineNumber++;
|
439
|
+
$$index++;
|
440
|
+
last;
|
441
|
+
}
|
442
|
+
else
|
443
|
+
{
|
444
|
+
$$index++;
|
445
|
+
};
|
446
|
+
};
|
447
|
+
};
|
448
|
+
|
449
|
+
|
450
|
+
#
|
451
|
+
# Function: SkipUntilAfter
|
452
|
+
#
|
453
|
+
# Moves the position to the token following the next occurance of a particular token sequence, or past the end of the tokens
|
454
|
+
# array if it never occurs. Useful for multiline comments.
|
455
|
+
#
|
456
|
+
# Note that it skips blindly. It assumes there cannot be anything of interest, such as a string delimiter, between the position
|
457
|
+
# and the end of the line.
|
458
|
+
#
|
459
|
+
# Parameters:
|
460
|
+
#
|
461
|
+
# indexRef - A reference to the position's index.
|
462
|
+
# lineNumberRef - A reference to the position's line number.
|
463
|
+
# token - A token that must be matched. Can be specified multiple times to match a sequence of tokens.
|
464
|
+
#
|
465
|
+
sub SkipUntilAfter #(indexRef, lineNumberRef, token, token, ...)
|
466
|
+
{
|
467
|
+
my ($self, $index, $lineNumber, @target) = @_;
|
468
|
+
my $tokens = $self->Tokens();
|
469
|
+
|
470
|
+
while ($$index < scalar @$tokens)
|
471
|
+
{
|
472
|
+
if ($tokens->[$$index] eq $target[0] && ($$index + scalar @target) <= scalar @$tokens)
|
473
|
+
{
|
474
|
+
my $match = 1;
|
475
|
+
|
476
|
+
for (my $i = 1; $i < scalar @target; $i++)
|
477
|
+
{
|
478
|
+
if ($tokens->[$$index+$i] ne $target[$i])
|
479
|
+
{
|
480
|
+
$match = 0;
|
481
|
+
last;
|
482
|
+
};
|
483
|
+
};
|
484
|
+
|
485
|
+
if ($match)
|
486
|
+
{
|
487
|
+
$$index += scalar @target;
|
488
|
+
return;
|
489
|
+
};
|
490
|
+
};
|
491
|
+
|
492
|
+
if ($tokens->[$$index] eq "\n")
|
493
|
+
{
|
494
|
+
$$lineNumber++;
|
495
|
+
$$index++;
|
496
|
+
}
|
497
|
+
else
|
498
|
+
{
|
499
|
+
$$index++;
|
500
|
+
};
|
501
|
+
};
|
502
|
+
};
|
503
|
+
|
504
|
+
|
505
|
+
#
|
506
|
+
# Function: IsFirstLineToken
|
507
|
+
#
|
508
|
+
# Returns whether the position is at the first token of a line, not including whitespace.
|
509
|
+
#
|
510
|
+
# Parameters:
|
511
|
+
#
|
512
|
+
# index - The index of the position.
|
513
|
+
#
|
514
|
+
sub IsFirstLineToken #(index)
|
515
|
+
{
|
516
|
+
my ($self, $index) = @_;
|
517
|
+
my $tokens = $self->Tokens();
|
518
|
+
|
519
|
+
if ($index == 0)
|
520
|
+
{ return 1; };
|
521
|
+
|
522
|
+
$index--;
|
523
|
+
|
524
|
+
if ($tokens->[$index] =~ /^[ \t]/)
|
525
|
+
{ $index--; };
|
526
|
+
|
527
|
+
if ($index <= 0 || $tokens->[$index] eq "\n")
|
528
|
+
{ return 1; }
|
529
|
+
else
|
530
|
+
{ return undef; };
|
531
|
+
};
|
532
|
+
|
533
|
+
|
534
|
+
#
|
535
|
+
# Function: IsLastLineToken
|
536
|
+
#
|
537
|
+
# Returns whether the position is at the last token of a line, not including whitespace.
|
538
|
+
#
|
539
|
+
# Parameters:
|
540
|
+
#
|
541
|
+
# index - The index of the position.
|
542
|
+
#
|
543
|
+
sub IsLastLineToken #(index)
|
544
|
+
{
|
545
|
+
my ($self, $index) = @_;
|
546
|
+
my $tokens = $self->Tokens();
|
547
|
+
|
548
|
+
do
|
549
|
+
{ $index++; }
|
550
|
+
while ($index < scalar @$tokens && $tokens->[$index] =~ /^[ \t]/);
|
551
|
+
|
552
|
+
if ($index >= scalar @$tokens || $tokens->[$index] eq "\n")
|
553
|
+
{ return 1; }
|
554
|
+
else
|
555
|
+
{ return undef; };
|
556
|
+
};
|
557
|
+
|
558
|
+
|
559
|
+
#
|
560
|
+
# Function: IsAtSequence
|
561
|
+
#
|
562
|
+
# Returns whether the position is at a sequence of tokens.
|
563
|
+
#
|
564
|
+
# Parameters:
|
565
|
+
#
|
566
|
+
# index - The index of the position.
|
567
|
+
# token - A token to match. Specify multiple times to specify the sequence.
|
568
|
+
#
|
569
|
+
sub IsAtSequence #(index, token, token, token ...)
|
570
|
+
{
|
571
|
+
my ($self, $index, @target) = @_;
|
572
|
+
my $tokens = $self->Tokens();
|
573
|
+
|
574
|
+
if ($index + scalar @target > scalar @$tokens)
|
575
|
+
{ return undef; };
|
576
|
+
|
577
|
+
for (my $i = 0; $i < scalar @target; $i++)
|
578
|
+
{
|
579
|
+
if ($tokens->[$index + $i] ne $target[$i])
|
580
|
+
{ return undef; };
|
581
|
+
};
|
582
|
+
|
583
|
+
return 1;
|
584
|
+
};
|
585
|
+
|
586
|
+
|
587
|
+
#
|
588
|
+
# Function: IsBackslashed
|
589
|
+
#
|
590
|
+
# Returns whether the position is after a backslash.
|
591
|
+
#
|
592
|
+
# Parameters:
|
593
|
+
#
|
594
|
+
# index - The index of the postition.
|
595
|
+
#
|
596
|
+
sub IsBackslashed #(index)
|
597
|
+
{
|
598
|
+
my ($self, $index) = @_;
|
599
|
+
my $tokens = $self->Tokens();
|
600
|
+
|
601
|
+
if ($index > 0 && $tokens->[$index - 1] eq "\\")
|
602
|
+
{ return 1; }
|
603
|
+
else
|
604
|
+
{ return undef; };
|
605
|
+
};
|
606
|
+
|
607
|
+
|
608
|
+
|
609
|
+
###############################################################################
|
610
|
+
#
|
611
|
+
# Group: Scope Functions
|
612
|
+
#
|
613
|
+
# These functions provide a nice scope stack implementation for language-specific parsers to use. The default implementation
|
614
|
+
# makes the following assumptions.
|
615
|
+
#
|
616
|
+
# - Packages completely replace one another, rather than concatenating. You need to concatenate manually if that's the
|
617
|
+
# behavior.
|
618
|
+
#
|
619
|
+
# - Packages inherit, so if a scope level doesn't set its own, the package is the same as the parent scope's.
|
620
|
+
#
|
621
|
+
|
622
|
+
|
623
|
+
#
|
624
|
+
# Function: ClearScopeStack
|
625
|
+
#
|
626
|
+
# Clears the scope stack for a new file. Not necessary if you call <ParseForCommentsAndTokens()>.
|
627
|
+
#
|
628
|
+
sub ClearScopeStack
|
629
|
+
{
|
630
|
+
my ($self) = @_;
|
631
|
+
$self->[SCOPE_STACK] = [ NaturalDocs::Languages::Advanced::Scope->New(undef, undef) ];
|
632
|
+
$self->[SCOPE_RECORD] = [ NaturalDocs::Languages::Advanced::ScopeChange->New(undef, 1) ];
|
633
|
+
};
|
634
|
+
|
635
|
+
|
636
|
+
#
|
637
|
+
# Function: StartScope
|
638
|
+
#
|
639
|
+
# Records a new scope level.
|
640
|
+
#
|
641
|
+
# Parameters:
|
642
|
+
#
|
643
|
+
# closingSymbol - The closing symbol of the scope.
|
644
|
+
# lineNumber - The line number where the scope begins.
|
645
|
+
# package - The package <SymbolString> of the scope. Undef means no change.
|
646
|
+
#
|
647
|
+
sub StartScope #(closingSymbol, lineNumber, package)
|
648
|
+
{
|
649
|
+
my ($self, $closingSymbol, $lineNumber, $package) = @_;
|
650
|
+
|
651
|
+
push @{$self->[SCOPE_STACK]},
|
652
|
+
NaturalDocs::Languages::Advanced::Scope->New($closingSymbol, $package, $self->CurrentUsing());
|
653
|
+
|
654
|
+
$self->AddToScopeRecord($self->CurrentScope(), $lineNumber);
|
655
|
+
};
|
656
|
+
|
657
|
+
|
658
|
+
#
|
659
|
+
# Function: EndScope
|
660
|
+
#
|
661
|
+
# Records the end of the current scope level. Note that this is blind; you need to manually check <ClosingScopeSymbol()> if
|
662
|
+
# you need to determine if it is correct to do so.
|
663
|
+
#
|
664
|
+
# Parameters:
|
665
|
+
#
|
666
|
+
# lineNumber - The line number where the scope ends.
|
667
|
+
#
|
668
|
+
sub EndScope #(lineNumber)
|
669
|
+
{
|
670
|
+
my ($self, $lineNumber) = @_;
|
671
|
+
|
672
|
+
if (scalar @{$self->[SCOPE_STACK]} > 1)
|
673
|
+
{ pop @{$self->[SCOPE_STACK]}; };
|
674
|
+
|
675
|
+
$self->AddToScopeRecord($self->CurrentScope(), $lineNumber);
|
676
|
+
};
|
677
|
+
|
678
|
+
|
679
|
+
#
|
680
|
+
# Function: ClosingScopeSymbol
|
681
|
+
#
|
682
|
+
# Returns the symbol that ends the current scope level, or undef if we are at the top level.
|
683
|
+
#
|
684
|
+
sub ClosingScopeSymbol
|
685
|
+
{
|
686
|
+
my ($self) = @_;
|
687
|
+
return $self->[SCOPE_STACK]->[-1]->ClosingSymbol();
|
688
|
+
};
|
689
|
+
|
690
|
+
|
691
|
+
#
|
692
|
+
# Function: CurrentScope
|
693
|
+
#
|
694
|
+
# Returns the current calculated scope, or undef if global. The default implementation just returns <CurrentPackage()>. This
|
695
|
+
# is a separate function because C++ may need to track namespaces and classes separately, and so the current scope would
|
696
|
+
# be a concatenation of them.
|
697
|
+
#
|
698
|
+
sub CurrentScope
|
699
|
+
{
|
700
|
+
return $_[0]->CurrentPackage();
|
701
|
+
};
|
702
|
+
|
703
|
+
|
704
|
+
#
|
705
|
+
# Function: CurrentPackage
|
706
|
+
#
|
707
|
+
# Returns the current calculated package or class, or undef if none.
|
708
|
+
#
|
709
|
+
sub CurrentPackage
|
710
|
+
{
|
711
|
+
my ($self) = @_;
|
712
|
+
|
713
|
+
my $package;
|
714
|
+
|
715
|
+
for (my $index = scalar @{$self->[SCOPE_STACK]} - 1; $index >= 0 && !defined $package; $index--)
|
716
|
+
{
|
717
|
+
$package = $self->[SCOPE_STACK]->[$index]->Package();
|
718
|
+
};
|
719
|
+
|
720
|
+
return $package;
|
721
|
+
};
|
722
|
+
|
723
|
+
|
724
|
+
#
|
725
|
+
# Function: SetPackage
|
726
|
+
#
|
727
|
+
# Sets the package for the current scope level.
|
728
|
+
#
|
729
|
+
# Parameters:
|
730
|
+
#
|
731
|
+
# package - The new package <SymbolString>.
|
732
|
+
# lineNumber - The line number the new package starts on.
|
733
|
+
#
|
734
|
+
sub SetPackage #(package, lineNumber)
|
735
|
+
{
|
736
|
+
my ($self, $package, $lineNumber) = @_;
|
737
|
+
$self->[SCOPE_STACK]->[-1]->SetPackage($package);
|
738
|
+
|
739
|
+
$self->AddToScopeRecord($self->CurrentScope(), $lineNumber);
|
740
|
+
};
|
741
|
+
|
742
|
+
|
743
|
+
#
|
744
|
+
# Function: CurrentUsing
|
745
|
+
#
|
746
|
+
# Returns the current calculated arrayref of <SymbolStrings> from Using statements, or undef if none.
|
747
|
+
#
|
748
|
+
sub CurrentUsing
|
749
|
+
{
|
750
|
+
my ($self) = @_;
|
751
|
+
return $self->[SCOPE_STACK]->[-1]->Using();
|
752
|
+
};
|
753
|
+
|
754
|
+
|
755
|
+
#
|
756
|
+
# Function: AddUsing
|
757
|
+
#
|
758
|
+
# Adds a Using <SymbolString> to the current scope.
|
759
|
+
#
|
760
|
+
sub AddUsing #(using)
|
761
|
+
{
|
762
|
+
my ($self, $using) = @_;
|
763
|
+
$self->[SCOPE_STACK]->[-1]->AddUsing($using);
|
764
|
+
};
|
765
|
+
|
766
|
+
|
767
|
+
|
768
|
+
###############################################################################
|
769
|
+
# Group: Support Functions
|
770
|
+
|
771
|
+
|
772
|
+
#
|
773
|
+
# Function: AddToScopeRecord
|
774
|
+
#
|
775
|
+
# Adds a change to the scope record, condensing unnecessary entries.
|
776
|
+
#
|
777
|
+
# Parameters:
|
778
|
+
#
|
779
|
+
# newScope - What the scope <SymbolString> changed to.
|
780
|
+
# lineNumber - Where the scope changed.
|
781
|
+
#
|
782
|
+
sub AddToScopeRecord #(newScope, lineNumber)
|
783
|
+
{
|
784
|
+
my ($self, $scope, $lineNumber) = @_;
|
785
|
+
my $scopeRecord = $self->ScopeRecord();
|
786
|
+
|
787
|
+
if ($scope ne $scopeRecord->[-1]->Scope())
|
788
|
+
{
|
789
|
+
if ($scopeRecord->[-1]->LineNumber() == $lineNumber)
|
790
|
+
{ $scopeRecord->[-1]->SetScope($scope); }
|
791
|
+
else
|
792
|
+
{ push @$scopeRecord, NaturalDocs::Languages::Advanced::ScopeChange->New($scope, $lineNumber); };
|
793
|
+
};
|
794
|
+
};
|
795
|
+
|
796
|
+
|
797
|
+
#
|
798
|
+
# Function: CreateString
|
799
|
+
#
|
800
|
+
# Converts the specified tokens into a string and returns it.
|
801
|
+
#
|
802
|
+
# Parameters:
|
803
|
+
#
|
804
|
+
# startIndex - The starting index to convert.
|
805
|
+
# endIndex - The ending index, which is *not inclusive*.
|
806
|
+
#
|
807
|
+
# Returns:
|
808
|
+
#
|
809
|
+
# The string.
|
810
|
+
#
|
811
|
+
sub CreateString #(startIndex, endIndex)
|
812
|
+
{
|
813
|
+
my ($self, $startIndex, $endIndex) = @_;
|
814
|
+
my $tokens = $self->Tokens();
|
815
|
+
|
816
|
+
my $string;
|
817
|
+
|
818
|
+
while ($startIndex < $endIndex && $startIndex < scalar @$tokens)
|
819
|
+
{
|
820
|
+
$string .= $tokens->[$startIndex];
|
821
|
+
$startIndex++;
|
822
|
+
};
|
823
|
+
|
824
|
+
return $string;
|
825
|
+
};
|
826
|
+
|
827
|
+
|
828
|
+
1;
|