diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-02-16 20:37:55 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-02-16 20:37:55 +0000 |
commit | 084c86a81820f17db9eee7362120586199008e27 (patch) | |
tree | 16d2356e05062ee32976a6507fec7cb3e8c7530d /dcopidlng/kalyptus | |
parent | f4fae92b6768541e2952173c3d4b09040f95bf7e (diff) | |
download | tdepim-084c86a81820f17db9eee7362120586199008e27.tar.gz tdepim-084c86a81820f17db9eee7362120586199008e27.zip |
Remove unused dcopidlng local copy
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1221130 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'dcopidlng/kalyptus')
-rw-r--r-- | dcopidlng/kalyptus | 1654 |
1 files changed, 0 insertions, 1654 deletions
diff --git a/dcopidlng/kalyptus b/dcopidlng/kalyptus deleted file mode 100644 index b2781d11c..000000000 --- a/dcopidlng/kalyptus +++ /dev/null @@ -1,1654 +0,0 @@ -#!/usr/bin/perl -I/Users/duke/src/kde/kdebindings/kalyptus - -# KDOC -- C++ and CORBA IDL interface documentation tool. -# Sirtaj Singh Kang <taj@kde.org>, Jan 1999. -# $Id$ - -# All files in this project are distributed under the GNU General -# Public License. This is Free Software. - -require 5.000; - -use Carp; -use Getopt::Long; -use File::Basename; -use strict; - -use Ast; - -use kdocUtil; -use kdocAstUtil; -use kdocParseDoc; - -use vars qw/ %rootNodes $declNodeType @includes_list %options @formats_wanted $allow_k_dcop_accessors - @includeclasses $includeclasses $skipInternal %defines $defines $match_qt_defines - $libdir $libname $outputdir @libs $parse_global_space $striphpath $doPrivate $readstdin - $Version $quiet $debug $debuggen $parseonly $currentfile $cSourceNode $exe - %formats %flagnames @allowed_k_dcop_accesors $allowed_k_dcop_accesors_re $rootNode - @classStack $cNode $globalSpaceClassName - $lastLine $docNode @includes $cpp $defcppcmd $cppcmd $docincluded - $inExtern %stats %definitions @inputqueue @codeqobject /; - -## globals - -%rootNodes = (); # root nodes for each file type -$declNodeType = undef; # last declaration type - -@includes_list = (); # list of files included from the parsed .h - -# All options - -%options = (); # hash of options (set getopt below) -@formats_wanted = (); -$libdir = $ENV{KDOCLIBS}; -$libname = ""; -$outputdir = "."; -@libs = (); # list of includes -$striphpath = 0; - -@includeclasses = (); # names of classes to include -$includeclasses = ""; - -$doPrivate = 0; -$Version = "0.9"; - -$quiet = 0; -$debug = 0; -$debuggen = 0; -$parseonly = 0; -$globalSpaceClassName = "QGlobalSpace"; - -$currentfile = ""; - -$cpp = 0; -$defcppcmd = "g++ -Wp,-C -E"; -$cppcmd = ""; - -$exe = basename $0; - -@inputqueue = (); -@codeqobject = split "\n", <<CODE; -public: - virtual QMetaObject *metaObject() const; - virtual const char *className() const; - virtual void* qt_cast( const char* ); - virtual bool qt_invoke( int, QUObject* ); - virtual bool qt_emit( int, QUObject* ); - virtual bool qt_property( int, int, QVariant* ); - static QMetaObject* staticMetaObject(); - QObject* qObject(); - static QString tr( const char *, const char * = 0 ); - static QString trUtf8( const char *, const char * = 0 ); -private: -CODE - -# Supported formats -%formats = ( "java" => "kalyptusCxxToJava", "c" => "kalyptusCxxToC", - "objc" => "kalyptusCxxToObjc", "dcopidl" => "kalyptusCxxToDcopIDL", - "smoke" => "kalyptusCxxToSmoke", "csharp" => "kalyptusCxxToCSharp", - "ECMA" => "kalyptusCxxToECMA", "swig" => "kalyptusCxxToSwig" ); - -# these are for expansion of method flags -%flagnames = ( v => 'virtual', 's' => 'static', p => 'pure', - c => 'const', l => 'slot', i => 'inline', n => 'signal', - d => 'k_dcop', z => 'k_dcop_signals', y => 'k_dcop_hidden' ); - -@allowed_k_dcop_accesors = qw(k_dcop k_dcop_hidden k_dcop_signals); -$allowed_k_dcop_accesors_re = join("|", @allowed_k_dcop_accesors); - -%definitions = { - _STYLE_CDE => '', - _STYLE_MOTIF => '', - _STYLE_MOTIF_PLUS => '', - PLUS => '', - _STYLE_PLATINUM => '', - _STYLE_SGI => '', - _STYLE_WINDOWS => '', - QT_STATIC_CONST => 'static const', - Q_EXPORT => '', - Q_REFCOUNT => '', - QM_EXPORT_CANVAS => '', - QM_EXPORT_DNS => '', - QM_EXPORT_ICONVIEW => '', - QM_EXPORT_NETWORK => '', - QM_EXPORT_SQL => '', - QM_EXPORT_WORKSPACE => '', - QT_NO_REMOTE => 'QT_NO_REMOTE', - QT_ACCESSIBILITY_SUPPORT => 'QT_ACCESSIBILITY_SUPPORT', - Q_WS_X11 => 'Q_WS_X11', - Q_DISABLE_COPY => 'Q_DISABLE_COPY', - Q_WS_QWS => 'undef', - Q_WS_MAC => 'undef', - Q_OBJECT => <<'CODE', -public: - virtual QMetaObject *metaObject() const; - virtual const char *className() const; - virtual bool qt_invoke( int, QUObject* ); - virtual bool qt_emit( int, QUObject* ); - static QString tr( const char *, const char * = 0 ); - static QString trUtf8( const char *, const char * = 0 ); -private: -CODE -}; - -=head1 KDOC -- Source documentation tool - - Sirtaj Singh Kang <taj@kde.org>, Dec 1998. - -=cut - -# read options - -Getopt::Long::config qw( no_ignore_case permute bundling auto_abbrev ); - -GetOptions( \%options, - "format|f=s", \@formats_wanted, - "url|u=s", - "skip-internal", \$skipInternal, - "skip-deprecated|e", - "document-all|a", - "compress|z", - "no-cache", # do not create $HOME/.kalyptus cache - # HTML options - "html-cols=i", - "html-logo=s", - - "strip-h-path", \$striphpath, - "outputdir|d=s", \$outputdir, - "stdin|i", \$readstdin, - "name|n=s", \$libname, - "help|h", \&show_usage, - "version|v|V", \&show_version, - "private|p", \$doPrivate, - "libdir|L=s", \$libdir, - "xref|l=s", \@libs, - "classes|c=s", \@includeclasses, - "globspace", \$parse_global_space, - "allow_k_dcop_accessors", \$allow_k_dcop_accessors, - - "cpp|P", \$cpp, - "docincluded", \$docincluded, - "cppcmd|C=s", \$cppcmd, - "includedir|I=s", \@includes, - "define=s", \%defines, # define a single preprocessing symbol - "defines=s", \$defines, # file containing preprocessing symbols, one per line - - "quiet|q", \$quiet, - "debug|D", \$debug, # debug the parsing - "debuggen", \$debuggen, # debug the file generation - "parse-only", \$parseonly ) - || exit 1; - -$| = 1 if $debug or $debuggen; - -# preprocessor settings - -if ( $cppcmd eq "" ) { - $cppcmd = $defcppcmd; -} -else { - $cpp = 1; -} - -if ($#includeclasses>=0) -{ - $includeclasses = join (" ", @includeclasses); - print "Using Classes: $includeclasses\n" unless $quiet; -} - -if ( $#includes >= 0 && !$cpp ) { - die "$exe: --includedir requires --cpp\n"; -} - -# Check output formats. HTML is the default -if( $#formats_wanted < 0 ) { - push @formats_wanted, "java"; -} - -foreach my $format ( @formats_wanted ) { - die "$exe: unsupported format '$format'.\n" - if !defined $formats{$format}; -} - -if( $defines ) -{ - open( DEFS, $defines ) or die "Couldn't open $defines: $!\n"; - my @defs = <DEFS>; - chomp @defs; - close DEFS; - foreach (@defs) - { - $defines{ $_ } = 1 unless exists $defines{ $_ }; - } -} - -# Check the %defines hash for QT_* symbols and compile the corresponding RE -# Otherwise, compile the default ones. Used for filtering in readCxxLine. -if ( my @qt_defines = map { ($_=~m/^QT_(.*)/)[0] } keys %defines) -{ - my $regexp = "m/^#\\s*ifn?def\\s+QT_(?:" . join('|', map { "\$qt_defines[$_]" } 0..$#qt_defines).")/o"; - $match_qt_defines = eval "sub { my \$s=shift; - \$s=~/^#\\s*if(n)?def/ || return 0; - if(!\$1) { return \$s=~$regexp ? 0:1 } - else { return \$s=~$regexp ? 1:0 } - }"; - die if $@; -} -else -{ - $match_qt_defines = eval q£ - sub - { - my $s = shift; - $s =~ m/^\#\s*ifndef\s+QT_NO_(?:REMOTE| # not in the default compile options - NIS| # ... - XINERAMA| - IMAGEIO_(?:MNG|JPEG)| - STYLE_(?:MAC|INTERLACE|COMPACT) - )/x; - } - £; - die if $@; -} -# Check if there any files to process. -# We do it here to prevent the libraries being loaded up first. - -checkFileArgs(); - -# work out libdir. This is created by kdocLib:writeDoc when -# required. -$libdir = $ENV{HOME}."/.kalyptus" unless $libdir ne ""; - - -###### -###### main program -###### - readLibraries(); - parseFiles(); - - if ( $parseonly ) { - print "\n\tParse Tree\n\t------------\n\n"; - kdocAstUtil::dumpAst( $rootNode ); - } - else { - writeDocumentation(); - writeLibrary() unless $libname eq ""; - } - - kdocAstUtil::printDebugStats() if $debug; - - exit 0; -###### - -sub checkFileArgs -{ - return unless $#ARGV < 0; - - die "$exe: no input files.\n" unless $readstdin; - - # read filenames from standard input - while (<STDIN>) { - chop; - $_ =~ s,\\,/,g; # back to fwd slash (for Windows) - foreach my $file ( split( /\s+/, $_ ) ) { - push @ARGV, $file; - } - } -} - -sub readLibraries -{ - return if $#libs < 0; - - require kdocLib; - foreach my $lib ( @libs ) { - print "$exe: reading lib: $lib\n" unless $quiet; - - my $relpath = exists $options{url} ? - $options{url} : $outputdir; - kdocLib::readLibrary( \&getRoot, $lib, $libdir, $relpath ); - } -} - -sub parseFiles -{ - foreach $currentfile ( @ARGV ) { - my $lang = "CXX"; - - if ( $currentfile =~ /\.idl\s*$/ ) { - # IDL file - $lang = "IDL"; - } - - # assume cxx file - if( $cpp ) { - # pass through preprocessor - my $cmd = $cppcmd; - foreach my $dir ( @includes ) { - $cmd .= " -I $dir "; - } - - $cmd .= " -DQOBJECTDEFS_H $currentfile"; - - open( INPUT, "$cmd |" ) - || croak "Can't preprocess $currentfile"; - } - else { - open( INPUT, "$currentfile" ) - || croak "Can't read from $currentfile"; - } - - print STDERR "$exe: processing $currentfile\n" unless $quiet; - - # reset vars - $rootNode = getRoot( $lang ); - - - # add to file lookup table - my $showname = $striphpath ? basename( $currentfile ) - : $currentfile; - $cSourceNode = Ast::New( $showname ); - $cSourceNode->AddProp( "NodeType", "source" ); - $cSourceNode->AddProp( "Path", $currentfile ); - $rootNode->AddPropList( "Sources", $cSourceNode ); - - # reset state - @classStack = (); - $cNode = $rootNode; - $inExtern = 0; - - # parse - my $k = undef; - while ( defined ($k = readDecl()) ) { - print "\nDecl: <$k>[$declNodeType]\n" if $debug; - if( identifyDecl( $k ) && $k =~ /{/ ) { - readCxxCodeBlock(); - } - } - close INPUT; - } -} - - -sub writeDocumentation -{ - foreach my $node ( values %rootNodes ) { - # postprocess - kdocAstUtil::linkNamespaces( $node ); - kdocAstUtil::makeInherit( $node, $node ); - kdocAstUtil::linkReferences( $node, $node ); - kdocAstUtil::calcStats( \%stats, $node, $node ); - - # write - no strict "refs"; - foreach my $format ( @formats_wanted ) { - my $pack = $formats{ $format }; - require $pack.".pm"; - - print STDERR "Generating bindings for $format ", - "language...\n" unless $quiet; - - my $f = "$pack\::writeDoc"; - &$f( $libname, $node, $outputdir, \%options ); - } - } -} - -sub writeLibrary -{ - if( $libname ne "" and !exists $options{'no-cache'} ) { - require kdocLib; - foreach my $lang ( keys %rootNodes ) { - my $node = $rootNodes{ $lang }; - kdocLib::writeDoc( $libname, $node, $lang, $libdir, - $outputdir, $options{url}, - exists $options{compress} ? 1 : 0 ); - } - } -} - -###### Parser routines - -=head2 readSourceLine - - Returns a raw line read from the current input file. - This is used by routines outside main, since I don t know - how to share fds. - -=cut - -sub readSourceLine -{ - return <INPUT>; -} - -=head2 readCxxLine - - Reads a C++ source line, skipping comments, blank lines, - preprocessor tokens and the Q_OBJECT macro - -=cut - -sub readCxxLine -{ - my( $p ); - my( $l ); - - while( 1 ) { - $p = shift @inputqueue || <INPUT>; - return undef if !defined ($p); - - $p =~ s#//.*$##g; # C++ comment - $p =~ s#/\*(?!\*).*?\*/##g; # C comment - - # join all multiline comments - if( $p =~ m#/\*(?!\*)#s ) { - # unterminated comment -LOOP: - while( defined ($l = <INPUT>) ) { - $l =~ s#//.*$##g; # C++ comment - $p .= $l; - $p =~ s#/\*(?!\*).*?\*/##sg; # C comment - last LOOP unless $p =~ m#(/\*(?!\*))|(\*/)#sg; - } - } - - if ( $p =~ /^\s*Q_OBJECT/ ) { - push @inputqueue, @codeqobject; - next; - } - # Hack, waiting for real handling of preprocessor defines - $p =~ s/QT_STATIC_CONST/static const/; - $p =~ s/KSVG_GET/KJS::Value get();/; - $p =~ s/KSVG_BASECLASS_GET/KJS::Value get();/; - $p =~ s/KSVG_BRIDGE/KJS::ObjectImp *bridge();/; - $p =~ s/KSVG_FORWARDGET/KJS::Value getforward();/; - $p =~ s/KSVG_PUT/bool put();/; - $p =~ s/KSVG_FORWARDPUT/bool putforward();/; - $p =~ s/KSVG_BASECLASS/virtual KJS::Value cache();/; - if ( $p =~ m/KSVG_DEFINE_PROTOTYPE\((\w+)\)/ ) { - push @inputqueue, split('\n',"namespace KSVG {\nclass $1 {\n};\n};"); - } - - next if ( $p =~ /^\s*$/s ); # blank lines -# || $p =~ /^\s*Q_OBJECT/ # QObject macro -# ); -# - - next if ( $p =~ /^\s*Q_ENUMS/ # ignore Q_ENUMS - || $p =~ /^\s*Q_PROPERTY/ # and Q_PROPERTY - || $p =~ /^\s*Q_OVERRIDE/ # and Q_OVERRIDE - || $p =~ /^\s*Q_SETS/ - || $p =~ /^\s*Q_DUMMY_COMPARISON_OPERATOR/ - || $p =~ /^\s*K_SYCOCATYPE/ # and K_SYCOCA stuff - || $p =~ /^\s*K_SYCOCAFACTORY/ # - || $p =~ /^\s*KSVG_/ # and KSVG stuff ;) - ); - - push @includes_list, $1 if $p =~ /^#include\s+<?(.*?)>?\s*$/; - - # remove all preprocessor macros - if( $p =~ /^\s*#\s*(\w+)/ ) { - # Handling of preprocessed sources: skip anything included from - # other files, unless --docincluded was passed. - if (!$docincluded && $p =~ /^\s*#\s*[0-9]+\s*\".*$/ - && not($p =~ /\"$currentfile\"/)) { - # include file markers - while( <INPUT> ) { - last if(/\"$currentfile\"/); - print "Overread $_" if $debug; - }; - print "Cont: $_" if $debug; - } - else { - # Skip platform-specific stuff, or #if 0 stuff - # or #else of something we parsed (e.g. for QKeySequence) - if ( $p =~ m/^#\s*ifdef\s*Q_WS_/ or - $p =~ m/^#\s*if\s+defined\(Q_WS_/ or - $p =~ m/^#\s*if\s+defined\(Q_OS_/ or - $p =~ m/^#\s*if\s+defined\(Q_CC_/ or - $p =~ m/^#\s*if\s+defined\(QT_THREAD_SUPPORT/ or - $p =~ m/^#\s*else/ or - $p =~ m/^#\s*if\s+defined\(Q_FULL_TEMPLATE_INSTANTIATION/ or - $p =~ m/^#\s*ifdef\s+CONTAINER_CUSTOM_WIDGETS/ or - &$match_qt_defines( $p ) or - $p =~ m/^#\s*if\s+0\s+/ ) { - my $if_depth = 1; - while ( defined $p && $if_depth > 0 ) { - $p = <INPUT>; - last if !defined $p; - $if_depth++ if $p =~ m/^#\s*if/; - $if_depth-- if $p =~ m/^#\s*endif/; - # Exit at #else in the #ifdef QT_NO_ACCEL/#else/#endif case - last if $if_depth == 1 && $p =~ m/^#\s*else\s/; - #ignore elif for now - print "Skipping ifdef'ed line: $p" if $debug; - } - } - - # multiline macros - while ( defined $p && $p =~ m#\\\s*$# ) { - $p = <INPUT>; - } - } - next; - } - - $lastLine = $p; - return $p; - } -} - -=head2 readCxxCodeBlock - - Reads a C++ code block (recursive curlies), returning the last line - or undef on error. - - Parameters: none - -=cut - -sub readCxxCodeBlock -{ -# Code: begins in a {, ends in }\s*;? -# In between: cxx source, including {} - my ( $count ) = 0; - my $l = undef; - - if ( defined $lastLine ) { - print "lastLine: '$lastLine'" if $debug; - - my $open = kdocUtil::countReg( $lastLine, "{" ); - my $close = kdocUtil::countReg( $lastLine, "}" ); - $count = $open - $close; - - return $lastLine if ( $open || $close) && $count == 0; - } - - # find opening brace - if ( $count == 0 ) { - while( $count == 0 ) { - $l = readCxxLine(); - return undef if !defined $l; - $l =~ s/\\.//g; - $l =~ s/'.?'//g; - $l =~ s/".*?"//g; - - $count += kdocUtil::countReg( $l, "{" ); - print "c ", $count, " at '$l'" if $debug; - } - $count -= kdocUtil::countReg( $l, "}" ); - } - - # find associated closing brace - while ( $count > 0 ) { - $l = readCxxLine(); - croak "Confused by unmatched braces" if !defined $l; - $l =~ s/\\.//g; - $l =~ s/'.?'//g; - $l =~ s/".*?"//g; - - my $add = kdocUtil::countReg( $l, "{" ); - my $sub = kdocUtil::countReg( $l, "}" ); - $count += $add - $sub; - - print "o ", $add, " c ", $sub, " at '$l'" if $debug; - } - - undef $lastLine; - return $l; -} - -=head2 readDecl - - Returns a declaration and sets the $declNodeType variable. - - A decl starts with a type or keyword and ends with [{};] - The entire decl is returned in a single line, sans newlines. - - declNodeType values: undef for error, "a" for access specifier, - "c" for doc comment, "d" for other decls. - - readCxxLine is used to read the declaration. - -=cut - -sub readDecl -{ - undef $declNodeType; - my $l = readCxxLine(); - my ( $decl ) = ""; - - my $allowed_accesors = "private|public|protected|signals"; - $allowed_accesors .= "|$allowed_k_dcop_accesors_re" if $allow_k_dcop_accessors; - - if( !defined $l ) { - return undef; - } - elsif ( $l =~ /^\s*($allowed_accesors) - (\s+\w+)?\s*:/x) { # access specifier - $declNodeType = "a"; - return $l; - } - elsif ( $l =~ /K_DCOP/ ) { - $declNodeType = "k"; - return $l; - } - elsif ( $l =~ m#^\s*/\*\*# ) { # doc comment - $declNodeType = "c"; - return $l; - } - - do { - $decl .= $l; - - if ( $l =~ /[{};]/ ) { - $decl =~ s/\n/ /gs; - $declNodeType = "d"; - return $decl; - } - return undef if !defined ($l = readCxxLine()); - - } while ( 1 ); -} - -#### AST Generator Routines - -=head2 getRoot - - Return a root node for the given type of input file. - -=cut - -sub getRoot -{ - my $type = shift; - carp "getRoot called without type" unless defined $type; - - if ( !exists $rootNodes{ $type } ) { - my $node = Ast::New( "Global" ); # parent of all nodes - $node->AddProp( "NodeType", "root" ); - $node->AddProp( "RootType", $type ); - $node->AddProp( "Compound", 1 ); - $node->AddProp( "KidAccess", "public" ); - - $rootNodes{ $type } = $node; - } - print "getRoot: call for $type\n" if $debug; - - return $rootNodes{ $type }; -} - -=head2 identifyDecl - - Parameters: decl - - Identifies a declaration returned by readDecl. If a code block - needs to be skipped, this subroutine returns a 1, or 0 otherwise. - -=cut - -sub identifyDecl -{ - my( $decl ) = @_; - - my $newNode = undef; - my $skipBlock = 0; - - # Doc comment - if ( $declNodeType eq "c" ) { - $docNode = kdocParseDoc::newDocComment( $decl ); - - # if it's the main doc, it is attached to the root node - if ( defined $docNode->{LibDoc} ) { - kdocParseDoc::attachDoc( $rootNode, $docNode, - $rootNode ); - undef $docNode; - } - - } - elsif ( $declNodeType eq "a" ) { - newAccess( $decl ); - } - elsif ( $declNodeType eq "k" ) { - $cNode->AddProp( "DcopExported", 1 ); - } - - # Typedef struct/class - elsif ( $decl =~ /^\s*typedef - \s+(struct|union|class|enum) - \s*([_\w\:]*) - \s*([;{]) - /xs ) { - my ($type, $name, $endtag, $rest ) = ($1, $2, $3, $' ); - $name = "--" if $name eq ""; - - warn "typedef '$type' n:'$name'\n" if $debug; - - if ( $rest =~ /}\s*([\w_]+(?:::[\w_])*)\s*;/ ) { - # TODO: Doesn't parse members yet! - $endtag = ";"; - $name = $1; - } - - $newNode = newTypedefComp( $type, $name, $endtag ); - } - - # Typedef - elsif ( $decl =~ /^\s*typedef\s+ - (?:typename\s+)? # `typename' keyword - (.*?\s*[\*&]?) # type - \s+([-\w_\:]+) # name - \s*((?:\[[-\w_\:<>\s]*\])*) # array - \s*[{;]\s*$/xs ) { - - print "Typedef: <$1 $3> <$2>\n" if $debug; - $newNode = newTypedef( $1." ".$3, $2 ); - } - - # Enum - elsif ( $decl =~ /^\s*enum\s+([-\w_:]*)?\s*\{(.*)/s ) { - - print "Enum: <$1>\n" if $debug; - my $enumname = defined $2 ? $1 : ""; - - $newNode = newEnum( $enumname ); - } - - # Class/Struct - elsif ( $decl =~ /^\s*((?:template\s*<.*>)?) # 1 template - \s*(class|struct|union|namespace) # 2 struct type - (?:\s*Q[A-Z_]*EXPORT[A-Z_]*)? - (?:\s*Q_PACKED)? - (?:\s*Q_REFCOUNT)? - \s+([\w_]+ # 3 name - (?:<[\w_ :,]+?>)? # maybe explicit template - # (eat chars between <> non-hungry) - (?:::[\w_]+)* # maybe nested - ) - (.*?) # 4 inheritance - ([;{])/xs ) { # 5 rest - - print "Class: [$1]\n\t[$2]\n\t[$3]\n\t[$4]\n\t[$5]\n" if $debug; - my ( $tmpl, $ntype, $name, $rest, $endtag ) = - ( $1, $2, $3, $4, $5 ); - - if ($includeclasses) - { - if (! ($includeclasses =~ /$name/) ) - { - return 1; - - } - } - - my @inherits = (); - - $tmpl =~ s/<(.*)>/$1/ if $tmpl ne ""; - - if( $rest =~ /^\s*:\s*/ ) { - # inheritance - $rest = $'; - @inherits = parseInheritance( $rest ); - } - - $newNode = newClass( $tmpl, $ntype, - $name, $endtag, @inherits ); - } - # IDL compound node - elsif( $decl =~ /^\s*(module|interface|exception) # struct type - \s+([-\w_]+) # name - (.*?) # inheritance? - ([;{])/xs ) { - - my ( $type, $name, $rest, $fwd, $complete ) - = ( $1, $2, $3, $4 eq ";" ? 1 : 0, - 0 ); - my @in = (); - print "IDL: [$type] [$name] [$rest] [$fwd]\n" if $debug; - - if( $rest =~ /^\s*:\s*/ ) { - $rest = $'; - $rest =~ s/\s+//g; - @in = split ",", $rest; - } - if( $decl =~ /}\s*;/ ) { - $complete = 1; - } - - $newNode = newIDLstruct( $type, $name, $fwd, $complete, @in ); - } - # Method - elsif ( $decl =~ /^\s*([^=]+?(?:operator\s*(?:\(\)|.?=)\s*)?) # ret+nm - \( (.*?) \) # parameters - \s*((?:const)?)\s* - \s*((?:=\s*0(?:L?))?)\s* # Pureness. is "0L" allowed? - \s*[;{]+/xs ) { # rest - - my $tpn = $1; # type + name - my $params = $2; - # Remove constructor initializer, that's not in the params - if ( $params =~ /\s*\)\s*:\s*/ ) { - # Hack: first .* made non-greedy for QSizePolicy using a?(b):c in ctor init - $params =~ s/(.*?)\s*\)\s*:\s*.*$/$1/; - } - - my $const = $3 eq "" ? 0 : 1; - my $pure = $4 eq "" ? 0 : 1; - $tpn =~ s/\s+/ /g; - $params =~ s/\s+/ /g; - - print "Method: R+N:[$tpn]\n\tP:[$params]\n\t[$const]\n" if $debug; - - if ( $tpn =~ /((?:\w+\s*::\s*)?operator.*?)\s*$/ # operator - || $tpn =~ /((?:\w*\s*::\s*~?)?[-\w:]+)\s*$/ ) { # normal - my $name = $1; - $tpn = $`; - $newNode = newMethod( $tpn, $name, - $params, $const, $pure ); - } - - $skipBlock = 1; # FIXME check end token before doing this! - } - # Using: import namespace - elsif ( $decl =~ /^\s*using\s+namespace\s+(\w+)/ ) { - newNamespace( $1 ); - - } - - # extern block - elsif ( $decl =~ /^\s*extern\s*"(.*)"\s*{/ ) { - $inExtern = 1 unless $decl =~ /}/; - } - - # Single variable - elsif ( $decl =~ /^ - \s*( (?:[\w_:]+(?:\s+[\w_:]+)*? )# type - \s*(?:<.+>)? # template - \s*(?:[\&\*])? # ptr or ref - (?:\s*(?:const|volatile))* ) - \s*([\w_:]+) # name - \s*( (?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? ) # array - \s*((?:=.*)?) # value - \s*([;{])\s*$/xs ) { - my $type = $1; - my $name = $2; - my $arr = $3; - my $val = $4; - my $end = $5; - - if ( $type !~ /^friend\s+class\s*/ ) { - print "Var: [$name] type: [$type$arr] val: [$val]\n" - if $debug; - - $newNode = newVar( $type.$arr, $name, $val ); - } - - $skipBlock = 1 if $end eq '{'; - } - - # Multi variables - elsif ( $decl =~ m/^ - \s*( (?:[\w_:]+(?:\s+[\w_:]+)*? ) # type - \s*(?:<.+>)?) # template - - \s*( (?:\s*(?: [\&\*][\&\*\s]*)? # ptr or ref - [\w_:]+) # name - \s*(?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? # array - \s*(?:, # extra vars - \s*(?: [\&\*][\&\*\s]*)? # ptr or ref - \s*(?:[\w_:]+) # name - \s*(?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? # array - )* - \s*(?:=.*)?) # value - \s*[;]/xs ) { - - my $type = $1; - my $names = $2; - my $end = $3; - my $doc = $docNode; - - print "Multivar: type: [$type] names: [$names] \n" if $debug; - - foreach my $vardecl ( split( /\s*,\s*/, $names ) ) { - next unless $vardecl =~ m/ - \s*((?: [\&\*][\&\*\s]*)?) # ptr or ref - \s*([\w_:]+) # name - \s*( (?:\[[^\[\]]*\] (?:\s*\[[^\[\]]*\])*)? ) # array - \s*((?:=.*)?) # value - /xs; - my ($ptr, $name, $arr, $val) = ($1, $2, $3, $4); - - print "Split: type: [$type$ptr$arr] ", - " name: [$name] val: [$val] \n" if $debug; - - my $node = newVar( $type.$ptr.$arr, $name, $val ); - - $docNode = $doc; # reuse docNode for each - postInitNode( $node ) unless !defined $node; - } - - $skipBlock = 1 if $end eq '{'; - } - # end of an "extern" block - elsif ( $decl =~ /^\s*}\s*$/ ) { - $inExtern = 0; - } - # end of an in-block declaration - elsif ( $decl =~ /^\s*}\s*(.*?)\s*;\s*$/ ) { - - if ( $cNode->{astNodeName} eq "--" ) { - # structure typedefs should have no name preassigned. - # If they do, then the name in - # "typedef struct <name> { ..." is kept instead. - # TODO: Buglet. You should fix YOUR code dammit. ;) - - - $cNode->{astNodeName} = $1; - my $siblings = $cNode->{Parent}->{KidHash}; - undef $siblings->{"--"}; - $siblings->{ $1 } = $cNode; - } - - if ( $#classStack < 0 ) { - confess "close decl found, but no class in stack!" ; - $cNode = $rootNode; - } - else { - $cNode = pop @classStack; - print "end decl: popped $cNode->{astNodeName}\n" - if $debug; - } - } - # unidentified block start - elsif ( $decl =~ /{/ ) { - print "Unidentified block start: $decl\n" if $debug; - $skipBlock = 1; - } - # explicit template instantiation, or friend template - elsif ( $decl =~ /(template|friend)\s+class\s+(?:Q[A-Z_]*EXPORT[A-Z_]*\s*)?\w+\s*<.*>\s*;/x ) { - # Nothing to be done with those. - } - else { - - ## decl is unidentified. - warn "Unidentified decl: $decl\n"; - } - - # once we get here, the last doc node is already used. - # postInitNode should NOT be called for forward decls - postInitNode( $newNode ) unless !defined $newNode; - - return $skipBlock; -} - -sub postInitNode -{ - my $newNode = shift; - - carp "Cannot postinit undef node." if !defined $newNode; - - # The reasoning here: - # Forward decls never get a source node. - # Once a source node is defined, don't assign another one. - - if ( $newNode->{NodeType} ne "Forward" && !defined $newNode->{Source}) { - $newNode->AddProp( "Source", $cSourceNode ); - } elsif ( $newNode->{NodeType} eq "Forward" ) { - if ($debug) { - print "postInit: skipping fwd: $newNode->{astNodeName}\n"; - } - undef $docNode; - return; - } - - if( defined $docNode ) { - kdocParseDoc::attachDoc( $newNode, $docNode, $rootNode ); - undef $docNode; - } -} - - -##### Node generators - -=head2 newEnum - - Reads the parameters of an enumeration. - - Returns the parameters, or undef on error. - -=cut - -sub newEnum -{ - my ( $enum ) = @_; - my $k = undef; - my $params = ""; - - $k = $lastLine if defined $lastLine; - - if( defined $lastLine && $lastLine =~ /{/ ) { - $params = $'; - if ( $lastLine =~ /}(.*?);/ ) { - return initEnum( $enum, $1, $params ); - } - } - - while ( defined ( $k = readCxxLine() ) ) { - $params .= $k; - - if ( $k =~ /}(.*?);/ ) { - return initEnum( $enum, $1, $params ); - } - } - - return undef; -} - -=head2 initEnum - - Parameters: name, (ref) params - - Returns an initialized enum node. - -=cut - -sub initEnum -{ - my( $name, $end, $params ) = @_; - - ($name = $end) if $name eq "" && $end ne ""; - - $params =~ s#\s+# #sg; # no newlines - $params = $1 if $params =~ /^\s*{?(.*)}/; - print "$name params: [$params]\n" if $debug; - - - my ( $node ) = Ast::New( $name ); - $node->AddProp( "NodeType", "enum" ); - $node->AddProp( "Params", $params ); - makeParamList( $node, $params, 1 ); # Adds the ParamList property containing the list of param nodes - kdocAstUtil::attachChild( $cNode, $node ); - - return $node; -} - -=head2 newIDLstruct - - Parameters: type, name, forward, complete, inherits... - - Handles an IDL structure definition (ie module, interface, - exception). - -=cut - -sub newIDLstruct -{ - my ( $type, $name, $fwd, $complete ) = @_; - - my $node = exists $cNode->{KidHash} ? - $cNode->{KidHash}->{ $name } : undef; - - if( !defined $node ) { - $node = Ast::New( $name ); - $node->AddProp( "NodeType", $fwd ? "Forward" : $type ); - $node->AddProp( "KidAccess", "public" ); - $node->AddProp( "Compound", 1 ) unless $fwd; - kdocAstUtil::attachChild( $cNode, $node ); - } - elsif ( $fwd ) { - # If we have a node already, we ignore forwards. - return undef; - } - elsif ( $node->{NodeType} eq "Forward" ) { - # we are defining a previously forward node. - $node->AddProp( "NodeType", $type ); - $node->AddProp( "Compound", 1 ); - $node->AddProp( "Source", $cSourceNode ); - } - - # register ancestors. - foreach my $ances ( splice ( @_, 4 ) ) { - my $n = kdocAstUtil::newInherit( $node, $ances ); - } - - if( !( $fwd || $complete) ) { - print "newIDL: pushing $cNode->{astNodeName},", - " new is $node->{astNodeName}\n" - if $debug; - push @classStack, $cNode; - $cNode = $node; - } - - return $node; -} - -=head2 newClass - - Parameters: tmplArgs, cNodeType, name, endTag, @inheritlist - - Handles a class declaration (also fwd decls). - -=cut - -sub newClass -{ - my( $tmplArgs, $cNodeType, $name, $endTag ) = @_; - - my $access = "private"; - $access = "public" if $cNodeType ne "class"; - - # try to find an exisiting node, or create a new one - my $oldnode = kdocAstUtil::findRef( $cNode, $name ); - my $node = defined $oldnode ? $oldnode : Ast::New( $name ); - - if ( $endTag ne "{" ) { - # forward - if ( !defined $oldnode ) { - # new forward node - $node->AddProp( "NodeType", "Forward" ); - $node->AddProp( "KidAccess", $access ); - kdocAstUtil::attachChild( $cNode, $node ); - } - return $node; - } - - # this is a class declaration - - print "ClassName: $name\n" if $debug; - - $node->AddProp( "NodeType", $cNodeType ); - $node->AddProp( "Compound", 1 ); - $node->AddProp( "Source", $cSourceNode ); - - $node->AddProp( "KidAccess", $access ); - $node->AddProp( "Tmpl", $tmplArgs ) unless $tmplArgs eq ""; - - if ( !defined $oldnode ) { - kdocAstUtil::attachChild( $cNode, $node ); - } - - # inheritance - - foreach my $ances ( splice (@_, 4) ) { - my $type = ""; - my $name = $ances; - my $intmpl = undef; - -WORD: - foreach my $word ( split ( /([\w:]+(:?\s*<.*>)?)/, $ances ) ) { - next WORD unless $word =~ /^[\w:]/; - if ( $word =~ /(private|public|protected|virtual)/ ) { - $type .= "$1 "; - } - else { - - if ( $word =~ /<(.*)>/ ) { - # FIXME: Handle multiple tmpl args - $name = $`; - $intmpl = $1; - } - else { - $name = $word; - } - - last WORD; - } - } - - # set inheritance access specifier if none specified - if ( $type eq "" ) { - $type = $cNodeType eq "class" ? "private ":"public "; - } - chop $type; - - # attach inheritance information - my $n = kdocAstUtil::newInherit( $node, $name ); - $n->AddProp( "Type", $type ); - - $n->AddProp( "TmplType", $intmpl ) if defined $intmpl; - - print "In: $name type: $type, tmpl: $intmpl\n" if $debug; - } - - # new current node - print "newClass: Pushing $cNode->{astNodeName}\n" if $debug; - push ( @classStack, $cNode ); - $cNode = $node; - - return $node; -} - - -=head3 parseInheritance - - Param: inheritance decl string - Returns: list of superclasses (template decls included) - - This will fail if < and > appear in strings in the decl. - -=cut - -sub parseInheritance -{ - my $instring = shift; - my @inherits = (); - - my $accum = ""; - foreach $instring ( split (/\s*,\s*/, $instring) ) { - $accum .= $instring.", "; - next unless (kdocUtil::countReg( $accum, "<" ) - - kdocUtil::countReg( $accum, ">" ) ) == 0; - - # matching no. of < and >, so assume the parent is - # complete - $accum =~ s/,\s*$//; - print "Inherits: '$accum'\n" if $debug; - push @inherits, $accum; - $accum = ""; - } - - return @inherits; -} - - -=head2 newNamespace - - Param: namespace name. - Returns nothing. - - Imports a namespace into the current node, for ref searches etc. - Triggered by "using namespace ..." - -=cut - -sub newNamespace -{ - $cNode->AddPropList( "ImpNames", shift ); -} - - - -=head2 newTypedef - - Parameters: realtype, name - - Handles a type definition. - -=cut - -sub newTypedef -{ - my ( $realtype, $name ) = @_; - - my ( $node ) = Ast::New( $name ); - - $node->AddProp( "NodeType", "typedef" ); - $node->AddProp( "Type", $realtype ); - - kdocAstUtil::attachChild( $cNode, $node ); - - return $node; -} - -=head2 newTypedefComp - - Params: realtype, name endtoken - - Creates a new compound type definition. - -=cut - -sub newTypedefComp -{ - my ( $realtype, $name, $endtag ) = @_; - - my ( $node ) = Ast::New( $name ); - - $node->AddProp( "NodeType", "typedef" ); - $node->AddProp( "Type", $realtype ); - - kdocAstUtil::attachChild( $cNode, $node ); - - if ( $endtag eq '{' ) { - print "newTypedefComp: Pushing $cNode->{astNodeName}\n" - if $debug; - push ( @classStack, $cNode ); - $cNode = $node; - } - - return $node; -} - - -=head2 newMethod - - Parameters: retType, name, params, const, pure? - - Handles a new method declaration or definition. - -=cut -BEGIN { - -my $theSourceNode = $cSourceNode; - -sub newMethod -{ - my ( $retType, $name, $params, $const, $pure ) = @_; - my $parent = $cNode; - my $class; - - print "Cracked: [$retType] [$name]\n\t[$params]\n\t[$const]\n" - if $debug; - - if ( $retType =~ /([\w\s_<>,]+)\s*::\s*$/ ) { - # check if stuff before :: got into rettype by mistake. - $retType = $`; - ($name = $1."::".$name); - $name =~ s/\s+/ /g; - print "New name = \"$name\" and type = '$retType'\n" if $debug; - } - - # A 'friend method' declaration isn't a real method declaration - return undef if ( $retType =~ /^friend\s+/ || $retType =~ /^friend\s+class\s+/ ); - - my $isGlobalSpace = 0; - my $nameWasChanged = 0; - my $origName; - - if( $name =~ /^\s*(.*?)\s*::\s*(.*?)\s*$/ ) { - # Fully qualified method name. - $name = $2; - $class = $1; - - if( $class =~ /^\s*$/ ) { - $parent = $rootNode; - } - elsif ( $class eq $cNode->{astNodeName} ) { - $parent = $cNode; - } - else { - # ALWAYS IGNORE... - return undef; - - my $node = kdocAstUtil::findRef( $cNode, $class ); - - if ( !defined $node ) { - # if we couldn't find the name, try again with - # all template parameters stripped off: - my $strippedClass = $class; - $strippedClass =~ s/<[^<>]*>//g; - - $node = kdocAstUtil::findRef( $cNode, $strippedClass ); - - # if still not found: give up - if ( !defined $node ) { - warn "$exe: Unidentified class: $class ". - "in $currentfile\:$.\n"; - return undef; - } - } - - $parent = $node; - } - } - # TODO fix for $retType =~ /template<.*?>/ - elsif( $parse_global_space && $parent->{NodeType} eq "root" && $name !~ /\s*qt_/ && $retType !~ /template\s*<.*?>/ ) { - $origName = $name; - # $name =~ s/^q([A-Z])([a-z]+)/$nameWasChanged++, lc($1).$2/e; # too much troubles (eg. qGLVersion, qRed vs. Qt::red ) - $name =~ s/^\s*operator(.*)$/$nameWasChanged++, "$1"/e; - $class = $globalSpaceClassName; # FIXME - sanitize the naming system? - $isGlobalSpace = 1; - - my $opsNode = kdocAstUtil::findRef( $cNode, $class ); - if (!$opsNode) { - # manually create a "GlobalSpace" class - $opsNode = Ast::New( $class ); - $opsNode->AddProp( "NodeType", "class" ); - $opsNode->AddProp( "Compound", 1 ); - $opsNode->AddProp( "Source", $cSourceNode ); # dummy - $opsNode->AddProp( "KidAccess", "public" ); - kdocAstUtil::attachChild( $cNode, $opsNode ); - } - unless( $theSourceNode == $cSourceNode ) { - $theSourceNode = $cSourceNode; - $opsNode->AddPropList( "Sources", $theSourceNode ); # sources are scattered across Qt - } - $parent = $opsNode; - } - - # flags - - my $flags = ""; - - if( $retType =~ /static/ || $isGlobalSpace ) { - $flags .= "s"; - $retType =~ s/static//g; - } - - if( $const && !$isGlobalSpace ) { - $flags .= "c"; - } - - if( $pure ) { - $flags .= "p"; - } - - if( $retType =~ /virtual/ ) { - $flags .= "v"; - $retType =~ s/virtual//g; - } - - print "\n" if $flags ne "" && $debug; - - if ( !defined $parent->{KidAccess} ) { - warn "'", $parent->{astNodeName}, "' has no KidAccess ", - exists $parent->{Forward} ? "(forward)\n" :"\n"; - } - - # NB, these are =~, so make sure they are listed in correct order - if ( $parent->{KidAccess} =~ /slot/ ) { - $flags .= "l"; - } - elsif ( $parent->{KidAccess} =~ /k_dcop_signals/ ) { - $flags .= "z"; - } - elsif ( $parent->{KidAccess} =~ /k_dcop_hidden/ ) { - $flags .= "y"; - } - elsif ( $parent->{KidAccess} =~ /k_dcop/ ) { - $flags .= "d"; - } - elsif ( $parent->{KidAccess} =~ /signal/ ) { - $flags .= "n"; - } - - $retType =~ s/QM?_EXPORT[_A-Z]*\s*//; - $retType =~ s/inline\s+//; - $retType =~ s/extern\s+//; - $retType =~ s/^\s*//g; - $retType =~ s/\s*$//g; - - # node - - my $node = Ast::New( $name ); - $node->AddProp( "NodeType", "method" ); - $node->AddProp( "Flags", $flags ); - $node->AddProp( "ReturnType", $retType ); - $node->AddProp( "Params", $params ); # The raw string with the whole param list - makeParamList( $node, $params, 0 ); # Adds the ParamList property containing the list of param nodes - - $parent->AddProp( "Pure", 1 ) if $pure; - - if ($nameWasChanged) { - $node->AddProp( "OriginalName", $origName ); - } - - kdocAstUtil::attachChild( $parent, $node ); - return $node; -} - -} - -=head2 makeParamList - - Parameters: - * method (or enum) node - * string containing the whole param list - * 1 for enums - - Adds a property "ParamList" to the method node. - This property contains a list of nodes, one for each parameter. - - Each parameter node has the following properties: - * ArgType the type of the argument, e.g. const QString& - * ArgName the name of the argument - optionnal - * DefaultValue the default value of the argument - optionnal - - For enum values, ArgType is unset, ArgName is the name, DefaultValue its value. - - Author: David Faure <david@mandrakesoft.com> -=cut - -sub makeParamList($$$) -{ - my ( $methodNode, $params, $isEnum ) = @_; - $params =~ s/\s+/ /g; # normalize multiple spaces/tabs into a single one - $params =~ s/\s*([,\*\&])\s*/$1 /g; # normalize spaces before and after *, & and ',' - $params =~ s/^\s*void\s*$//; # foo(void) ==> foo() - $params =~ s/^\s*$//; - # Make sure the property always exists, makes iteration over it easier - $methodNode->AddProp( "ParamList", [] ); - - my @args = kdocUtil::splitUnnested( ',', $params); - - my $argId = 0; - foreach my $arg ( @args ) { - my $argType; - my $argName; - my $defaultparam; - $arg =~ s/\s*([^\s].*[^\s])\s*/$1/; # stripWhiteSpace - $arg =~ s/(\w+)\[\]/\* $1/; # Turn [] array into * - - # The RE below reads as: = ( string constant or char - # or some word/number, with optional bitwise shifts, OR'ed or +'ed flags, and/or function call ). - if ( $arg =~ s/\s*=\s*(("[^\"]*")|(\'.\')|(([-\w:~]*)\s*([<>\|\+-]*\s*\w*\s*)*(\([^(]*\))?))// ) { - $defaultparam = $1; - } - - # Separate arg type from arg name, if the latter is specified - if ( $arg =~ /(.*)\s+([\w_]+)\s*$/ || $arg =~ /(.*)\(\s*\*\s([\w_]+)\)\s*\((.*)\)\s*$/ ) { - if ( defined $3 ) { # function pointer - $argType = $1."(*)($3)"; - $argName = $2; - } else { - $argType = $1; - $argName = $2; - } - } else { # unnamed arg - or enum value - $argType = $arg if (!$isEnum); - $argName = $arg if ($isEnum); - } - $argId++; - - my $node = Ast::New( $argId ); # let's make the arg index the node "name" - $node->AddProp( "NodeType", "param" ); - $node->AddProp( "ArgType", $argType ); - $node->AddProp( "ArgName", $argName ) if (defined $argName); - $node->AddProp( "DefaultValue", $defaultparam ) if (defined $defaultparam); - $methodNode->AddPropList( "ParamList", $node ); - print STDERR "ArgType: $argType ArgName: $argName\n" if ($debug); - } -} - -=head2 newAccess - - Parameters: access - - Sets the default "Access" specifier for the current class node. If - the access is a "slot" type, "_slots" is appended to the access - string. - -=cut - -sub newAccess -{ - my ( $access ) = @_; - - return undef unless ($access =~ /^\s*(\w+)\s*(slots|$allowed_k_dcop_accesors_re)?/); - - print "Access: [$1] [$2]\n" if $debug; - - $access = $1; - - if ( defined $2 && $2 ne "" ) { - $access .= "_" . $2; - } - - $cNode->AddProp( "KidAccess", $access ); - - return $cNode; -} - - -=head2 newVar - - Parameters: type, name, value - - New variable. Value is ignored if undef - -=cut - -sub newVar -{ - my ( $type, $name, $val ) = @_; - - my $node = Ast::New( $name ); - $node->AddProp( "NodeType", "var" ); - - my $static = 0; - if ( $type =~ /static/ ) { - # $type =~ s/static//; - $static = 1; - } - - $node->AddProp( "Type", $type ); - $node->AddProp( "Flags", 's' ) if $static; - $node->AddProp( "Value", $val ) if defined $val; - kdocAstUtil::attachChild( $cNode, $node ); - - return $node; -} - - - -=head2 show_usage - - Display usage information and quit. - -=cut - -sub show_usage -{ -print<<EOF; -usage: - $exe [options] [-f format] [-d outdir] [-n name] files... [-llib..] - -See the man page kdoc[1] for more info. -EOF - exit 1; -} - - -=head2 show_version - - Display short version information and quit. - -=cut - -sub show_version -{ - die "$exe: $Version (c) Sirtaj S. Kang <taj\@kde.org>\n"; -} - - |