summaryrefslogtreecommitdiffstats
path: root/languages/perl
diff options
context:
space:
mode:
Diffstat (limited to 'languages/perl')
-rw-r--r--languages/perl/Makefile.am25
-rw-r--r--languages/perl/README.dox46
-rw-r--r--languages/perl/app_templates/Makefile.am3
-rw-r--r--languages/perl/app_templates/perl.appwizard2
-rw-r--r--languages/perl/app_templates/perlhello/.kdev_ignore0
-rw-r--r--languages/perl/app_templates/perlhello/Makefile.am16
-rw-r--r--languages/perl/app_templates/perlhello/app.kdevelop77
-rwxr-xr-xlanguages/perl/app_templates/perlhello/app.pl43
-rw-r--r--languages/perl/app_templates/perlhello/perlhello10
-rw-r--r--languages/perl/app_templates/perlhello/perlhello.kdevtemplate108
-rw-r--r--languages/perl/app_templates/perlhello/perlhello.pngbin0 -> 17622 bytes
-rw-r--r--languages/perl/doc/Makefile.am6
-rw-r--r--languages/perl/doc/perl.toc54
-rw-r--r--languages/perl/doc/perl_bugs.toc7
-rw-r--r--languages/perl/file_templates/Makefile.am4
-rw-r--r--languages/perl/file_templates/pl43
-rw-r--r--languages/perl/file_templates/pm68
-rw-r--r--languages/perl/kdevperlsupport.desktop85
-rw-r--r--languages/perl/kdevperlsupport.rc14
-rw-r--r--languages/perl/perlconfigwidget.cpp38
-rw-r--r--languages/perl/perlconfigwidget.h34
-rw-r--r--languages/perl/perlconfigwidgetbase.ui101
-rw-r--r--languages/perl/perldoc.cpp133
-rw-r--r--languages/perl/perldoc.h25
-rw-r--r--languages/perl/perldoc.protocol9
-rw-r--r--languages/perl/perlparser.cpp494
-rw-r--r--languages/perl/perlparser.h87
-rw-r--r--languages/perl/perlsupportpart.cpp330
-rw-r--r--languages/perl/perlsupportpart.h59
29 files changed, 1921 insertions, 0 deletions
diff --git a/languages/perl/Makefile.am b/languages/perl/Makefile.am
new file mode 100644
index 00000000..2354c124
--- /dev/null
+++ b/languages/perl/Makefile.am
@@ -0,0 +1,25 @@
+# Here resides the Perl support part.
+
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/interfaces/external -I$(top_srcdir)/lib/util \
+ $(all_includes)
+SUBDIRS = app_templates file_templates doc
+
+
+kde_module_LTLIBRARIES = libkdevperlsupport.la kio_perldoc.la
+libkdevperlsupport_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevperlsupport_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevperlsupport_la_SOURCES = perlparser.cpp perlsupportpart.cpp perlconfigwidget.cpp perlconfigwidgetbase.ui
+
+kio_perldoc_la_SOURCES = perldoc.cpp
+kio_perldoc_la_LIBADD = $(LIB_KIO)
+kio_perldoc_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevperlsupport.desktop perldoc.protocol
+
+rcdir = $(kde_datadir)/kdevperlsupport
+rc_DATA = kdevperlsupport.rc
diff --git a/languages/perl/README.dox b/languages/perl/README.dox
new file mode 100644
index 00000000..f8608a41
--- /dev/null
+++ b/languages/perl/README.dox
@@ -0,0 +1,46 @@
+/** \class PerlSupportPart
+This is perl language support plugin.
+
+Put a more detailed description of your part in these lines. It can span
+over several lines. You can even use some html commands in these lines like:
+<code>This is code</code>, html links <a href="http://somelocation">link text</a>,
+and images.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+\authors <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\maintainer <a href="mailto:willems.luc AT pandora.be">Luc Willems</a>
+
+\feature perl programming language support
+\feature Consult \ref LangSupportStatus for a up to date features/status of this programming language support part.
+
+\bug Describe a the 1st bug that you know of, but probably hasn't been reported yet.
+..
+\bug Describe a the nth bug that you know of, but probably hasn't been reported yet.
+
+\requirement Describe a the 1st requirement of your part.
+\requirement Describe a the 2nd requirement of your part.
+...
+\requirement Describe a the nth requirement of your part.
+
+\todo Describe a the 1st TODO of your part.
+\todo Describe a the 2nd TODO of your part.
+...
+\todo Describe a the nth TODO of your part.
+
+\faq <b>First frequenly asked question about your part ?</b> Answer.
+\faq <b>Second frequenly asked question about your part ?</b> Answer.
+...
+\faq <b>Last frequenly asked question about your part ?</b> Answer.
+
+\note First note text.
+\note Second note text.
+...
+\note Last note text.
+
+\warning First warning text.
+\warning Second warning text.
+...
+\warning Last warning text.
+
+*/
diff --git a/languages/perl/app_templates/Makefile.am b/languages/perl/app_templates/Makefile.am
new file mode 100644
index 00000000..c284be59
--- /dev/null
+++ b/languages/perl/app_templates/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = perlhello
+profilesdir = $(kde_datadir)/kdevelop/profiles/IDE/ScriptingLanguageIDE/PerlIDE
+profiles_DATA = perl.appwizard
diff --git a/languages/perl/app_templates/perl.appwizard b/languages/perl/app_templates/perl.appwizard
new file mode 100644
index 00000000..44c9faf9
--- /dev/null
+++ b/languages/perl/app_templates/perl.appwizard
@@ -0,0 +1,2 @@
+[General]
+List=perlhello
diff --git a/languages/perl/app_templates/perlhello/.kdev_ignore b/languages/perl/app_templates/perlhello/.kdev_ignore
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/.kdev_ignore
diff --git a/languages/perl/app_templates/perlhello/Makefile.am b/languages/perl/app_templates/perlhello/Makefile.am
new file mode 100644
index 00000000..1c1d7b33
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/Makefile.am
@@ -0,0 +1,16 @@
+dataFiles = app.pl app.kdevelop
+templateName = perlhello
+
+### no need to change below:
+template_DATA = $(templateName).kdevtemplate
+templatedir = ${appwizarddatadir}/templates
+
+appwizarddatadir = ${kde_datadir}/kdevappwizard
+$(templateName).tar.gz: ${dataFiles}
+ $(TAR) -cf $(templateName).tar -C $(srcdir) ${dataFiles}
+ $(GZIP_COMMAND) -f9 $(templateName).tar
+
+archivedir = ${appwizarddatadir}
+archive_DATA = $(templateName).tar.gz ${templateName}.png
+
+CLEANFILES = *.tar.gz \ No newline at end of file
diff --git a/languages/perl/app_templates/perlhello/app.kdevelop b/languages/perl/app_templates/perlhello/app.kdevelop
new file mode 100644
index 00000000..c781322d
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/app.kdevelop
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<kdevelop>
+ <general>
+ <author>%{AUTHOR}</author>
+ <email>%{EMAIL}</email>
+ <version>%{VERSION}</version>
+ <projectmanagement>KDevScriptProject</projectmanagement>
+ <primarylanguage>Perl</primarylanguage>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ </general>
+ <kdevscriptproject>
+ <run>
+ <mainprogram>./%{APPNAMELC}.pl</mainprogram>
+ </run>
+ <general>
+ <includepatterns>*.pl,*.pm</includepatterns>
+ <excludepatterns>*~</excludepatterns>
+ </general>
+ </kdevscriptproject>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>c++_bugs_gcc</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>kde2book</toc>
+ <toc>libc</toc>
+ <toc>libstdc++</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>qt-kdev3</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>Guide to the Qt Translation Tools</toc>
+ <toc>Qt Assistant Manual</toc>
+ <toc>Qt Designer Manual</toc>
+ <toc>Qt Reference Documentation</toc>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ <ignoredoxygen>
+ <toc>KDE Libraries (Doxygen)</toc>
+ </ignoredoxygen>
+ </kdevdoctreeview>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="" />
+ <type ext="pl" />
+ <type ext="pm" />
+ </useglobaltypes>
+ </kdevfilecreate>
+</kdevelop>
diff --git a/languages/perl/app_templates/perlhello/app.pl b/languages/perl/app_templates/perlhello/app.pl
new file mode 100755
index 00000000..bd6bbf6a
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/app.pl
@@ -0,0 +1,43 @@
+#!/usr/bin/perl -w
+#
+use strict;
+use warnings;
+
+
+#program version
+my $VERSION="%{VERSION}";
+
+#For CVS , use following line
+#my $VERSION=sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+sub do_something {
+ my $text=shift;
+ print "$text\n";
+}
+
+&do_something("Hello World");
+print "That's all folks for version $VERSION \n";
+
+__END__
+
+=head1 NAME
+
+%{APPNAME} - short description of your program
+
+=head1 SYNOPSIS
+
+ how to use your program
+
+=head1 DESCRIPTION
+
+ long description of your program
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ %{AUTHOR}
+
+=cut
diff --git a/languages/perl/app_templates/perlhello/perlhello b/languages/perl/app_templates/perlhello/perlhello
new file mode 100644
index 00000000..1f015e1b
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello
@@ -0,0 +1,10 @@
+# KDE Config File
+[General]
+Name=Simple Perl script
+Name[fr]=Un simple script de test Hello world
+Icon=camel.png
+Category=Perl
+Comment=This generates a simplistic 'Hello world' program in Perl (http://www.perl.org)
+Comment[fr]=Gnre un simple script de test du type Hello world dans le language PERL (http://www.perl.org).
+FileTemplates=perl,ShellStyle
+ShowFilesAfterGeneration=APPNAMELC.pl
diff --git a/languages/perl/app_templates/perlhello/perlhello.kdevtemplate b/languages/perl/app_templates/perlhello/perlhello.kdevtemplate
new file mode 100644
index 00000000..ead7b5b8
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello.kdevtemplate
@@ -0,0 +1,108 @@
+# KDE Config File
+[General]
+Name=Simple Perl script
+Name[ca]=Simple script en Perl
+Name[da]=Simpelt Perl script
+Name[de]=Einfaches Perl-Skript
+Name[el]=Απλό σενάριο Perl
+Name[es]=Guión sencillo en Perl
+Name[et]=Lihtne Perli skript
+Name[eu]=Perl script sinplea
+Name[fa]=دست‌نوشتۀ سادۀ پرل
+Name[fr]=Script Perl simple
+Name[ga]=Script shimplí Perl
+Name[gl]=Script sinxelo en Perl
+Name[hu]=Egyszerű Perl-szkript
+Name[it]=Semplice script Perl
+Name[ja]=簡単な Perl スクリプト
+Name[nds]=Eenfach Perl-Skript
+Name[ne]=साधारण पर्ल स्क्रिप्ट
+Name[nl]=Eenvoudig Perl-script
+Name[pl]=Prosty skrypt w Perlu
+Name[pt]=Programa simples em Perl
+Name[pt_BR]=Programa simples em Perl
+Name[ru]=Простой скрипт Perl
+Name[sk]=Jednoduchý Perl skript
+Name[sr]=Једноставна Perl скрипта
+Name[sr@Latn]=Jednostavna Perl skripta
+Name[sv]=Enkelt Perl-skript
+Name[tr]=Basit Perl betiği
+Name[zh_CN]=简单 Perl 脚本
+Name[zh_TW]=簡單的 Perl 文稿
+Icon=camel.png
+Category=Perl
+Comment=This generates a simplistic 'Hello world' program in Perl (http://www.perl.org)
+Comment[ca]=Genera un simple programa de 'Hello world' en Perl (http://www.perl.org)
+Comment[da]=Dette genererer et simplistisk 'Goddag verden' program i Perl (http://www.perl.org)
+Comment[de]=Hiermit wird ein einfaches "Hello World"-Programm in Perl erstellt (http://www.perl.org).
+Comment[el]=Αυτό δημιουργεί ένα απλό πρόγραμμα 'Γεια σου κόσμε' σε Perl (http://www.perl.org)
+Comment[es]=Genera un programa «Hola mundo» sencillo en Perl (http://www.perl.org)
+Comment[et]=Lihtsa "Tere, maailm" programmi loomine Perlis (http://www.perl.org)
+Comment[eu]=Honek "Kaixo mundua" Perl-en (http://www.perl.org) idatzitako programa sinple bat sortzen du.
+Comment[fa]=یک برنامۀ سادۀ «Hello world» در پرل (http://www.perl.org) تولید می‌کند
+Comment[fr]=Génère un programme « Bonjour monde » simple en Perl (http://www.perl.org)
+Comment[ga]=Cruthaíonn sé seo ríomhchlár simplí "Hello world" i Perl (http://www.perl.org/)
+Comment[gl]=Isto xera un programa sinxelo en Perl 'Ola mundo'(http://www.perl.org)
+Comment[hu]=Létrehoz egy egyszerű 'Hello world' programot Perlben (http://www.perl.org)
+Comment[it]=Genera un semplice programma di "Hello world" in Perl (http://www.perl.org)
+Comment[ja]=Perl で書かれた簡単な Hello world プログラムを作成します
+Comment[nds]=Dit stellt en eenfach "Moin Welt"-Programm in Perl op.(http://www.perl.org).
+Comment[ne]=यसले पर्लमा साधारण 'हेल्लो वोल्ड' कार्यक्रम उत्पन्न गर्दछ (http://www.perl.org)
+Comment[nl]=Dit genereert een eenvoudig Hello World-programma in Perl (http://www.perl.org)
+Comment[pl]=Generuje prosty skrypt "Witaj świecie" w Perlu (http://www.perl.org)
+Comment[pt]=Isto gera um programa simples 'Olá mundo' em Perl (http://www.perl.org)
+Comment[pt_BR]=Isto gera um programa simples 'Olá mundo' em Perl (http://www.perl.org)
+Comment[ru]=Создание простой программы 'Hello world' на Perl (http://www.perl.org)
+Comment[sk]=Vygeneruje jednoduchý Ahoj svet program v Perl (http://www.perl.org)
+Comment[sr]=Прави једноставан „Здраво свете“ програм у Perl-у (http://www.perl.org)
+Comment[sr@Latn]=Pravi jednostavan „Zdravo svete“ program u Perl-u (http://www.perl.org)
+Comment[sv]=Detta skapar ett förenklat 'Hello world'-program i Perl (http://www.perl.org)
+Comment[tr]=Bu, Perl'de basit bir "Merhaba Dünya" programı yaratır (http://www.perl.org)
+Comment[zh_CN]=这将生成一个简单的 Perl 语言“Hello world”程序
+Comment[zh_TW]=產生一個簡單的 Perl (http://www.perl.org) 的 Hello world 程式
+FileTemplates=perl,ShellStyle
+ShowFilesAfterGeneration=%{dest}/%{APPNAMELC}.pl
+Archive=perlhello.tar.gz
+
+[FILE1]
+Type=install
+EscapeXML=true
+Source=%{src}/app.kdevelop
+Dest=%{dest}/%{APPNAMELC}.kdevelop
+
+[FILE2]
+Type=install
+Source=%{src}/app.pl
+Dest=%{dest}/%{APPNAMELC}.pl
+
+[MSG]
+Type=message
+Comment=A simple Perl script was created in %{dest}
+Comment[ca]=Un simple script en Perl ha estat creat en %{dest}
+Comment[da]=Et simpelt Perl script blev oprettet i %{dest}
+Comment[de]=Ein einfaches Perl-Skript wurde in %{dest} erstellt.
+Comment[el]=Ένα απλό σενάριο Perl δημιουργήθηκε στο %{dest}
+Comment[es]=Un sencillo guión en Perl ha sido creado en %{dest}
+Comment[et]=Lihtne Perli skript loodi asukohta %{dest}
+Comment[eu]=Perl script sinple bat sortu da hemen: %{dest}
+Comment[fa]=یک دست‌نوشتۀ سادۀ پرل در %{dest} ایجاد شد
+Comment[fr]=Un script Perl simple a été créé dans %{dest}
+Comment[ga]=Cruthaíodh script shimplí Perl i %{dest}
+Comment[gl]=Creouse un script sinxelo en Perl en %{dest}
+Comment[hu]=Létrejött egy egyszerű Perl-szkript itt: %{dest}
+Comment[it]=È stato creato un semplice script Perl in %{dest}
+Comment[ja]=簡単な Perl スクリプトを %{dest} に作成しました
+Comment[nds]=In %{dest} wöör en eenfach Perl-Skript opstellt.
+Comment[ne]=साधारण पर्ल स्क्रिप्ट %{dest} मा सिर्जना गरियो
+Comment[nl]=Een eenvoudig Perl-script is aangemaakt in %{dest}
+Comment[pl]=Prosty skrypt w Perlu został utworzony w %{dest}
+Comment[pt]=Foi criado um programa simples em Perl em %{dest}
+Comment[pt_BR]=Foi criado um programa simples em Perl em %{dest}
+Comment[ru]=Простой скрипт Perl создан в %{dest}
+Comment[sk]=Jednoduchý Perl skript bol vytvorený v %{dest}
+Comment[sr]=Једноставна Perl скрипта направљена је у %{dest}
+Comment[sr@Latn]=Jednostavna Perl skripta napravljena je u %{dest}
+Comment[sv]=Ett enkelt Perl-skript skapades i %{dest}
+Comment[tr]=Basit Perl betiği %{dest} içinde yaratıldı.
+Comment[zh_CN]=在 %{dest} 创建了一个简单的 Perl 脚本
+Comment[zh_TW]=一個簡單的 Perl 文稿已建立於 %{dest}
diff --git a/languages/perl/app_templates/perlhello/perlhello.png b/languages/perl/app_templates/perlhello/perlhello.png
new file mode 100644
index 00000000..78e0532a
--- /dev/null
+++ b/languages/perl/app_templates/perlhello/perlhello.png
Binary files differ
diff --git a/languages/perl/doc/Makefile.am b/languages/perl/doc/Makefile.am
new file mode 100644
index 00000000..dae5d699
--- /dev/null
+++ b/languages/perl/doc/Makefile.am
@@ -0,0 +1,6 @@
+tocdir = ${kde_datadir}/kdevdocumentation/tocs
+toc_DATA = perl.toc perl_bugs.toc
+
+#indexdir = ${kde_datadir}/devdoctreeview/indices
+#index_DATA =
+
diff --git a/languages/perl/doc/perl.toc b/languages/perl/doc/perl.toc
new file mode 100644
index 00000000..84cb8145
--- /dev/null
+++ b/languages/perl/doc/perl.toc
@@ -0,0 +1,54 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Perl</title>
+<tocsect1 name="Data structures" url="man:perldata"/>
+<tocsect1 name="Syntax" url="man:perlsyn"/>
+<tocsect1 name="Operators and Precedence" url="man:perlop"/>
+<tocsect1 name="Regular Expressions" url="man:perlre"/>
+<tocsect1 name="Execution and Options" url="man:perlrun"/>
+<tocsect1 name="Builtin Functions" url="man:perlfunc"/>
+<tocsect1 name="open() Tutorial" url="man:perlopentut"/>
+<tocsect1 name="Predefined Variables" url="man:perlvar"/>
+<tocsect1 name="Subroutines" url="man:perlsub"/>
+<tocsect1 name="Modules: how they work" url="man:perlmod"/>
+<tocsect1 name="Modules: how to write and use" url="man:perlmodlib"/>
+<tocsect1 name="Modules: how to install from CPAN" url="man:perlmodinstall"/>
+<tocsect1 name="Formats" url="man:perlform"/>
+<tocsect1 name="Unicode Support" url="man:perlunicode"/>
+<tocsect1 name="Locale Support" url="man:perllocale"/>
+<tocsect1 name="References Introduction" url="man:perlreftut"/>
+<tocsect1 name="References, the rest of the story" url="man:perlref"/>
+<tocsect1 name="Data Structures: introduction" url="man:perldsc"/>
+<tocsect1 name="Data Structures: arrrays of arrays" url="man:perllol"/>
+<tocsect1 name="OO tutorial 1" url="man:perlboot"/>
+<tocsect1 name="OO tutorial 2" url="man:perltoot"/>
+<tocsect1 name="OO tutorial 3" url="man:perltootc"/>
+<tocsect1 name="Objects" url="man:perlobj"/>
+<tocsect1 name="Objects hidden behind simple variables" url="man:perltie"/>
+<tocsect1 name="OO tricks and examples" url="man:perlbot"/>
+<tocsect1 name="Interprocess Communication" url="man:perlipc"/>
+<tocsect1 name="fork() Information" url="man:perlfork"/>
+<tocsect1 name="Threads Tutorial" url="man:perlthrtut"/>
+<tocsect1 name="Warnings and their Control" url="man:perllexwarn"/>
+<tocsect1 name="Source Filters" url="man:perlfilter"/>
+<tocsect1 name="DBM Filters" url="man:perldbmfilter"/>
+<tocsect1 name="Compiler Suite Introduction" url="man:perlcompile"/>
+<tocsect1 name="Debugging" url="man:perldebug"/>
+<tocsect1 name="Diagnostic Messages" url="man:perldiag"/>
+<tocsect1 name="Number semantics" url="man:perlnumber"/>
+<tocsect1 name="Security" url="man:perlsec"/>
+<tocsect1 name="Traps for the Unwary" url="man:perltrap"/>
+<tocsect1 name="Portability Guide" url="man:perlport"/>
+<tocsect1 name="Style Guide" url="man:perlstyle"/>
+<tocsect1 name="POD" url="man:perlpod"/>
+<tocsect1 name="Embed Perl in C" url="man:perlembed"/>
+<tocsect1 name="Internal IO abstraction interface" url="man:perlapio"/>
+<tocsect1 name="Debugging guts and tips" url="man:perldebguts"/>
+<tocsect1 name="XS API" url="man:perlxs"/>
+<tocsect1 name="XS Tutorial" url="man:perlxstut"/>
+<tocsect1 name="Internal Functions" url="man:perlguts"/>
+<tocsect1 name="Calling conventions from C" url="man:perlcall"/>
+<tocsect1 name="API listing" url="man:perlapi"/>
+<tocsect1 name="Internal functions" url="man:perlintern"/>
+</kdeveloptoc>
+
diff --git a/languages/perl/doc/perl_bugs.toc b/languages/perl/doc/perl_bugs.toc
new file mode 100644
index 00000000..126b35f3
--- /dev/null
+++ b/languages/perl/doc/perl_bugs.toc
@@ -0,0 +1,7 @@
+<!DOCTYPE kdeveloptoc>
+<kdeveloptoc>
+<title>Perl bugs</title>
+<base href="http://www.nntp.perl.org/"/>
+<tocsect1 name="Query" url="group">
+</tocsect1>
+</kdeveloptoc>
diff --git a/languages/perl/file_templates/Makefile.am b/languages/perl/file_templates/Makefile.am
new file mode 100644
index 00000000..f1f8457d
--- /dev/null
+++ b/languages/perl/file_templates/Makefile.am
@@ -0,0 +1,4 @@
+templatedir = $(kde_datadir)/kdevfilecreate/file-templates
+template_DATA = pl pm
+
+
diff --git a/languages/perl/file_templates/pl b/languages/perl/file_templates/pl
new file mode 100644
index 00000000..bacfcdda
--- /dev/null
+++ b/languages/perl/file_templates/pl
@@ -0,0 +1,43 @@
+#!/usr/bin/perl -w
+#
+use strict;
+use warnings;
+
+
+#program version
+my $VERSION="$VERSION$";
+
+#For CVS , use following line
+#my $VERSION=sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+sub do_something {
+ my $text=shift;
+ print "$text\n";
+}
+
+&do_something("Hello World");
+print "That's all folks for version $VERSION \n";
+
+__END__
+
+=head1 NAME
+
+Script name - short discription of your program
+
+=head1 SYNOPSIS
+
+ how to us your program
+
+=head1 DESCRIPTION
+
+ long description of your program
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ $AUTHOR$
+
+=cut
diff --git a/languages/perl/file_templates/pm b/languages/perl/file_templates/pm
new file mode 100644
index 00000000..c0e33a1d
--- /dev/null
+++ b/languages/perl/file_templates/pm
@@ -0,0 +1,68 @@
+package $MODULE$;
+
+use strict;
+
+require Exporter;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+
+# set the version for version checking
+$VERSION = $VERSION$;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(&hello);
+%EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ],
+
+# your exported package globals go here,
+# as well as any optionally exported functions
+@EXPORT_OK = qw($Var1 %Hashit &func3);
+
+use vars qw($Var1 %Hashit);
+# non-exported package globals go here
+use vars qw(@more $stuff);
+
+# initialize package globals, first exported ones
+$Var1 = '';
+%Hashit = ();
+
+# then the others (which are still accessible as $Some::Module::stuff)
+$stuff = '';
+@more = ();
+
+
+# file-private lexicals go here
+my $priv_var = '';
+my %secret_hash = ();
+
+
+sub hello {
+ print "hello world\n";
+}
+
+
+END { } # module clean-up code here (global destructor)
+
+1;
+
+__END__
+
+=head1 NAME
+
+ModuleName - short discription of your program
+
+=head1 SYNOPSIS
+
+ how to us your module
+
+=head1 DESCRIPTION
+
+ long description of your module
+
+=head1 SEE ALSO
+
+ need to know things before somebody uses your program
+
+=head1 AUTHOR
+
+ $AUTHOR$
+
+=cut
diff --git a/languages/perl/kdevperlsupport.desktop b/languages/perl/kdevperlsupport.desktop
new file mode 100644
index 00000000..66cfc907
--- /dev/null
+++ b/languages/perl/kdevperlsupport.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=Perl Support
+Comment[ca]=Suport per a Perl
+Comment[da]=Perl-understøttelse
+Comment[de]=Perl-Unterstützung für KDevelop
+Comment[el]=Υποστήριξη Perl
+Comment[es]=Soporte para Perl
+Comment[et]=Perli toetus
+Comment[eu]=Perl euskarria
+Comment[fa]=پشتیبانی پرل
+Comment[fr]=Prise en charge du langage Perl
+Comment[ga]=Tacaíocht Perl
+Comment[gl]=Soporte para Perl
+Comment[hi]=पर्ल समर्थन
+Comment[hu]=Perl-támogatás
+Comment[is]=Perl stuðningur
+Comment[it]=Supporto Perl
+Comment[ja]=Perl サポート
+Comment[nds]=Ünnerstütten för Perl
+Comment[ne]=पर्ल समर्थन
+Comment[nl]=Ondersteuning voor Perl
+Comment[pl]=Obsługa Perla
+Comment[pt]=Suporte a Perl
+Comment[pt_BR]=Suporte ao Perl
+Comment[ru]=Поддержка языка Perl
+Comment[sk]=Perl podpora
+Comment[sl]=Podpora za perl
+Comment[sr]=Подршка за Perl
+Comment[sr@Latn]=Podrška za Perl
+Comment[sv]=Perl-stöd
+Comment[ta]=பெர்ல் ஆதரவு
+Comment[tg]=Ёрӣ намудани забони Perl
+Comment[tr]=Perl Desteği
+Comment[zh_CN]=Perl 支持
+Comment[zh_TW]=Perl 支援
+Name=KDevPerlSupport
+Name[da]=KDevelop Perl-understøttelse
+Name[de]=Unterstützung für Perl (KDevelop)
+Name[hi]=के-डेव-पर्ल-समर्थन
+Name[nds]=Perl-Ünnerstütten för KDevelop
+Name[pl]=KDevObsługaPerla
+Name[sk]=KDev Perl podpora
+Name[sv]=KDevelop Perl-stöd
+Name[ta]=கெடெவ் பெர்ல் ஆதரவு
+Name[zh_TW]=KDevelop Perl 支援
+GenericName=Perl Support
+GenericName[ca]=Suport per a Perl
+GenericName[da]=Perl-understøttelse
+GenericName[de]=Unterstützung für Perl
+GenericName[el]=Υποστήριξη Perl
+GenericName[es]=Soporte para Perl
+GenericName[et]=Perli toetus
+GenericName[eu]=Perl euskarria
+GenericName[fa]=پشتیبانی پرل
+GenericName[fr]=Prise en charge du langage PERL
+GenericName[ga]=Tacaíocht Perl
+GenericName[gl]=Soporte para Perl
+GenericName[hi]=पर्ल समर्थन
+GenericName[hu]=Perl-támogatás
+GenericName[it]=Supporto per Perl
+GenericName[ja]=Perl サポート
+GenericName[nds]=Ünnerstütten för Perl
+GenericName[ne]=पर्ल समर्थन
+GenericName[nl]=Ondersteuning voor Perl
+GenericName[pl]=Obsługa Perla
+GenericName[pt]=Suporte a Perl
+GenericName[pt_BR]=Suporte ao Perl
+GenericName[ru]=Поддержка языка Perl
+GenericName[sk]=Perl podpora
+GenericName[sl]=Podpora za perl
+GenericName[sr]=Подршка за Perl
+GenericName[sr@Latn]=Podrška za Perl
+GenericName[sv]=Perl-stöd
+GenericName[ta]=பெர்ல் ஆதரவு
+GenericName[tg]=Ёрӣ намудани забони Perl
+GenericName[tr]=Perl Desteği
+GenericName[zh_CN]=Perl 支持
+GenericName[zh_TW]=Perl 支援
+ServiceTypes=KDevelop/LanguageSupport
+X-KDE-Library=libkdevperlsupport
+X-KDevelop-Version=5
+X-KDevelop-Language=Perl
+
diff --git a/languages/perl/kdevperlsupport.rc b/languages/perl/kdevperlsupport.rc
new file mode 100644
index 00000000..9f5f4ee9
--- /dev/null
+++ b/languages/perl/kdevperlsupport.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="KDevPerlSupport" version="1">
+<MenuBar>
+ <Menu name="build" >
+ <Action name="build_exec" />
+ <Action name="build_runinterpreter" />
+ <Action name="build_execstring" />
+ </Menu>
+ <Menu name="help">
+ <Action name="help_perldocfunction"/>
+ <Action name="help_perldocfaq"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/languages/perl/perlconfigwidget.cpp b/languages/perl/perlconfigwidget.cpp
new file mode 100644
index 00000000..475ed8af
--- /dev/null
+++ b/languages/perl/perlconfigwidget.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "perlconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include "domutil.h"
+
+
+PerlConfigWidget::PerlConfigWidget(QDomDocument &projectDom,
+ QWidget *parent, const char *name)
+ : PerlConfigWidgetBase(parent, name), dom(projectDom)
+{
+ interpreter_edit->setText(DomUtil::readEntry(dom, "/kdevperlsupport/run/interpreter"));
+ terminal_box->setChecked(DomUtil::readBoolEntry(dom, "/kdevperlsupport/run/terminal"));
+}
+
+
+PerlConfigWidget::~PerlConfigWidget()
+{}
+
+
+void PerlConfigWidget::accept()
+{
+ DomUtil::writeEntry(dom, "/kdevperlsupport/run/interpreter", interpreter_edit->text());
+ DomUtil::writeBoolEntry(dom, "/kdevperlsupport/run/terminal", terminal_box->isChecked());
+}
+
+#include "perlconfigwidget.moc"
diff --git a/languages/perl/perlconfigwidget.h b/languages/perl/perlconfigwidget.h
new file mode 100644
index 00000000..07364a40
--- /dev/null
+++ b/languages/perl/perlconfigwidget.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PERLCONFIGWIDGET_H_
+#define _PERLCONFIGWIDGET_H_
+
+#include "perlconfigwidgetbase.h"
+#include <qdom.h>
+
+
+class PerlConfigWidget : public PerlConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ PerlConfigWidget( QDomDocument &projectDom, QWidget *parent=0, const char *name=0 );
+ ~PerlConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ QDomDocument &dom;
+};
+
+#endif
diff --git a/languages/perl/perlconfigwidgetbase.ui b/languages/perl/perlconfigwidgetbase.ui
new file mode 100644
index 00000000..8becd0f4
--- /dev/null
+++ b/languages/perl/perlconfigwidgetbase.ui
@@ -0,0 +1,101 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>PerlConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>perl_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Perl</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>interpreter_label</cstring>
+ </property>
+ <property name="text">
+ <string>Perl &amp;interpreter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>interpreter_edit</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>terminal_box</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Execute programs in a terminal</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/languages/perl/perldoc.cpp b/languages/perl/perldoc.cpp
new file mode 100644
index 00000000..cbb4d18f
--- /dev/null
+++ b/languages/perl/perldoc.cpp
@@ -0,0 +1,133 @@
+#include "perldoc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <qtextstream.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kinstance.h>
+#include <kprocess.h>
+#include <kdeversion.h>
+#include <kglobal.h>
+
+using namespace KIO;
+
+
+PerldocProtocol::PerldocProtocol(const QCString &pool, const QCString &app)
+ : SlaveBase("perldoc", pool, app)
+{}
+
+
+PerldocProtocol::~PerldocProtocol()
+{}
+
+
+void PerldocProtocol::get(const KURL& url)
+{
+ QStringList l = QStringList::split('/', url.path());
+
+ mimeType("text/html");
+
+ bool plain = false;
+ QString cmd = "perldoc ";
+ if (l[0] == "functions") {
+ plain = true;
+ cmd += "-t -f ";
+ cmd += KProcess::quote(l[1]);
+ } else if (l[0] == "faq") {
+ cmd += "-u -q ";
+ cmd += KProcess::quote(l[1]);
+ cmd += " | pod2html";
+ } else {
+ QCString errstr(i18n("The only existing directories are functions and faq.").local8Bit());
+ data(errstr);
+ finished();
+ return;
+ }
+
+ kdDebug() << "Command: " << cmd << endl;
+
+ if (plain)
+ data(QCString("<blockquote>"));
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4090];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ data(array);
+ array.resetRawData(buffer, n);
+ }
+
+ pclose(fd);
+
+ if (plain)
+ data(QCString("</blockquote>"));
+
+ finished();
+}
+
+
+void PerldocProtocol::mimetype(const KURL &url)
+{
+ QStringList l = QStringList::split('/', url.path());
+ mimeType((l[0] == "faq")? "text/html" : "text/plain");
+ finished();
+}
+
+
+QCString PerldocProtocol::errorMessage()
+{
+ return QCString( "<html><body bgcolor=\"#FFFFFF\">" + i18n("Error in perldoc").local8Bit() + "</body></html>" );
+}
+
+
+void PerldocProtocol::stat(const KURL &/*url*/)
+{
+ UDSAtom uds_atom;
+ uds_atom.m_uds = KIO::UDS_FILE_TYPE;
+ uds_atom.m_long = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
+
+ UDSEntry uds_entry;
+ uds_entry.append(uds_atom);
+
+ statEntry(uds_entry);
+ finished();
+}
+
+
+void PerldocProtocol::listDir(const KURL &url)
+{
+ error( KIO::ERR_CANNOT_ENTER_DIRECTORY, url.path() );
+}
+
+
+extern "C" {
+
+ int kdemain(int argc, char **argv)
+ {
+ KInstance instance( "kio_perldoc" );
+ KGlobal::locale()->setMainCatalogue("kdevelop");
+
+ if (argc != 4) {
+ fprintf(stderr, "Usage: kio_perldoc protocol domain-socket1 domain-socket2\n");
+ exit(-1);
+ }
+
+ PerldocProtocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ return 0;
+ }
+
+}
diff --git a/languages/perl/perldoc.h b/languages/perl/perldoc.h
new file mode 100644
index 00000000..00cced89
--- /dev/null
+++ b/languages/perl/perldoc.h
@@ -0,0 +1,25 @@
+#ifndef _PERLDOC_H_
+#define _PERLDOC_H_
+
+#include <qobject.h>
+#include <kio/slavebase.h>
+
+
+class PerldocProtocol : public KIO::SlaveBase
+{
+public:
+ PerldocProtocol(const QCString &pool, const QCString &app);
+ virtual ~PerldocProtocol();
+
+ virtual void get(const KURL& url);
+ virtual void stat(const KURL& url);
+ virtual void mimetype(const KURL& url);
+ virtual void listDir(const KURL& url);
+
+protected:
+ void decodeURL(const KURL &url);
+ void decodePath(QString path);
+ QCString errorMessage();
+};
+
+#endif
diff --git a/languages/perl/perldoc.protocol b/languages/perl/perldoc.protocol
new file mode 100644
index 00000000..031ca931
--- /dev/null
+++ b/languages/perl/perldoc.protocol
@@ -0,0 +1,9 @@
+[Protocol]
+exec=kio_perldoc
+protocol=perldoc
+input=none
+output=filesystem
+reading=true
+listing=Name
+determineMimetypeFromExtension=false
+Icon=help
diff --git a/languages/perl/perlparser.cpp b/languages/perl/perlparser.cpp
new file mode 100644
index 00000000..a6a5a834
--- /dev/null
+++ b/languages/perl/perlparser.cpp
@@ -0,0 +1,494 @@
+/***************************************************************************
+ perlparser.cpp - description
+ -------------------
+ begin : Sun Nov 2 2003
+ copyright : (C) 2003 by luc
+ email : willems.luc(at)pandora.be
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "perlparser.h"
+
+#include <kdebug.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qfileinfo.h>
+
+perlparser::perlparser(KDevCore* core,CodeModel* model, QString interpreter) {
+ m_core = core;
+ m_model = model;
+ m_interpreter=interpreter;
+ //get INC paths for current installed perl
+ getPerlINC();
+
+}
+
+perlparser::~perlparser(){
+}
+
+const QStringList perlparser::UseFiles()
+{
+ return m_usefiles;
+}
+
+void perlparser::initialParse() {
+ m_usefiles.clear();
+}
+
+void perlparser::parse(const QString &fileName){
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly))
+ return;
+ QTextStream stream(&f);
+ QStringList list;
+ QString rawline;
+ while (!stream.eof()) {
+ rawline = stream.readLine();
+ list.append(rawline.stripWhiteSpace().local8Bit());
+ }
+ f.close();
+ kdDebug(9016) << "parsing " << fileName << endl;
+
+ m_file = m_model->create<FileModel>();
+ m_file->setName(fileName );
+ this->parseLines(&list,fileName);
+ m_model->addFile( m_file );
+}
+
+void perlparser::parseLines(QStringList* lines,const QString &fileName)
+{
+ QRegExp packagere("^[ \t]*package[ \t]+([+A-Za-z0-9_:]*).*\\;");
+ QRegExp basere("^[ \t]*use[ \t]+base[ \t]*\\(\'*\"*([A-Za-z0-9_:]*)");
+ QRegExp libre("^[ \t]*use[ \t]+lib[ \t]*\\(\'*\"*([A-Za-z0-9_:]*)");
+ QRegExp usere("^[ \t]*use[ \t]+([+A-Za-z0-9_:]*).*\\;");
+ QRegExp isare("^[ \t]*@ISA[ \t=qw\\(\'\"]*([A-Za-z0-9_: ]*)");
+ QRegExp globalre("^[ \t]*our[ \t]+\\(*([ \t,$%@*+A-Za-z0-9_]*)\\)*.*");
+ QRegExp myre("^[ \t]*my[ \t]+\\(*([ \t,$%@*+A-Za-z0-9_]*)\\)*.*");
+ QRegExp subre("^[ \t]*sub[ \t]+([A-Za-z0-9_]+)([A-Za-z0-9_]|([ \t]*[{])?)$");
+ QRegExp blessre("bless[ \t]*[\\( ]*([,$%@*+A-Za-z0-9_]*).*;");
+ QRegExp namere("^[ \t]*([$%@*])([A-Za-z0-9_]*).*$");
+ QRegExp privatere("^_([A-Za-z0-9_]*)");
+ QRegExp startpod("^=[a-z0-9]+ [a-z0-9]*");
+ QRegExp cutpod("^=cut");
+
+ QString line;
+
+ //clear all "last" know things
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage = false;
+ m_inscript = false;
+ m_inclass=false;
+
+ m_lastscript=0;
+ m_lastpackage=0;
+ m_lastclass=0;
+
+ int lineNo = -1;
+
+ bool inpod = false;
+ bool endpod = false;
+
+ //check if we are parsing a script or module
+ QFileInfo fi(fileName);
+ bool inscript =(fi.extension() == "pl");
+ kdDebug(9016) << "inscript : " << inscript << "," << fi.extension() << endl;
+
+ if (inscript) {
+ addScript(fileName,lineNo,fi.fileName());
+ }
+
+ for ( QStringList::Iterator it = lines->begin(); it != lines->end(); ++it ) {
+ ++lineNo;
+ line = (*it).local8Bit();
+ //empty line ?
+ if (line.isEmpty()) { continue;}
+ //some POD checking , quick and dirty but it seams to work
+ if(inpod && endpod) { inpod=false; endpod=false;}
+ //are we in pod documentation ?
+ if (startpod.search(line)>=0) {inpod=true; continue;}
+ //are we in pod documentation ?
+ if (inpod) { endpod=( cutpod.search(line)>=0 ); continue; }
+
+
+ //sub matching
+ if (subre.search(line)>=0){
+ QString subname=subre.cap(1);
+ kdDebug(9016) << "subre match [" << subname << "]" << endl;
+ bool prive = privatere.search(subname) >= 0;
+ kdDebug(9016) << "prive match [" << prive << "]" << endl;
+ if (m_inscript) { addScriptSub(fileName,lineNo,subname,prive);}
+ else {
+ if (m_inclass) { addClassMethod(fileName,lineNo,subname,prive);}
+ else { addPackageSub(fileName,lineNo,subname,prive);}
+ }
+ continue;
+ } //sub
+
+ //our matching
+ if (globalre.search(line)>=0) {
+ //splitup multible ours
+ QString varlist=globalre.cap(1);
+ kdDebug(9016) << "globalre match [" << varlist <<"]" << endl;
+ QStringList vars=QStringList::split(",",varlist);
+ for ( QStringList::Iterator it = vars.begin(); it != vars.end(); ++it ) {
+ if (namere.search(*it)>=0) {
+ QString var = namere.cap(2);
+ kdDebug(9016) << "namere match [" << var << "]" << endl;
+ if (m_lastpackage) { addAttributetoPackage(fileName,lineNo,var); }
+ else { addAttributetoScript(fileName,lineNo,var); }
+ }
+ }
+ continue;
+ } //globalre
+
+
+ //bless matching
+ if ((blessre.search(line)>=0) && (!m_inscript)) {
+ kdDebug(9016) << "blessre match []" << endl;
+ addClass(fileName,lineNo);
+ addConstructor(fileName,lineNo,m_lastsub);
+ continue;
+ } //bless
+
+ //base matching
+ if ((basere.search(line)>=0) && (!m_inscript)) {
+ QString parent = basere.cap(1);
+ //create child & parent classes
+ kdDebug(9016) << "basere match [" << parent << "]" << endl;
+ addClass(fileName,lineNo);
+ addParentClass(parent);
+ continue;
+ } else {
+ if (libre.search(line)>=0) {
+ QString path = libre.cap(1);
+ //add lib to INC path list
+ kdDebug(9016) << "libre match [" << path << "]" << endl;
+ m_INClist.append(path);
+ continue;
+ } else {
+ if (usere.search(line)>=0) {
+ //add lib to use list for later parsing
+ QString lib = usere.cap(1);
+ kdDebug(9016) << "usere match [" << lib << "]" << endl;
+ addUseLib(lib);
+ continue;
+ } \
+ }
+ } //base
+
+ if ((isare.search(line)>=0) && (!m_inscript)) {
+ QString parent = isare.cap(1);
+ //create child & parent classes
+ kdDebug(9016) << "isare match [" << parent << "]" << endl;
+ addClass(fileName,lineNo);
+ addParentClass(parent);
+ continue;
+ } //isa
+
+ if ((packagere.search(line)>=0) && (!m_inscript)) {
+ QString package=packagere.cap(1);
+ kdDebug(9016) << "packagere match [" << package << "]" << endl;
+ addPackage(fileName,lineNo,package);
+ continue;
+ }//package
+
+ } // for lines loop
+}
+
+void perlparser::addPackage(const QString& fileName ,int lineNr , const QString& name)
+{
+ kdDebug(9016) << "AddPackage [" << name << "]" << endl;
+ NamespaceDom package = m_model->create<NamespaceModel>();
+
+ package->setName(name);
+ package->setFileName(fileName );
+ package->setStartPosition(lineNr, 0 );
+ package->setScope(name);
+
+ if (!m_file->hasNamespace(name)) {
+ m_file->addNamespace(package);
+ m_lastpackage=package;
+ } else {
+ kdDebug(9016) << "addPackage [" << name << " exist]" << endl;
+ }
+
+ //clear all "last" know things
+ m_lastpackagename=name;
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage=true;
+ m_inscript = false;
+ m_inclass=false;
+
+ m_lastclass=0;
+ m_lastscript=0;
+
+}
+
+void perlparser::addScript(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addScript [" << name << "]" << endl;
+
+ //map name of script under /scripts
+ //m_file->setName("/Scripts/"+name);
+
+ kdDebug(9016) << "addScript [" << name << "]" << endl;
+ NamespaceDom script = m_model->create<NamespaceModel>();
+
+ script->setName(name);
+ script->setFileName(fileName );
+ script->setStartPosition(lineNr, 0 );
+ script->setScope(name);
+
+ if (!m_file->hasNamespace(name)) {
+ m_file->addNamespace(script);
+ m_lastscript=script;
+ } else {
+ kdDebug(9016) << "addScript [" << name << " exist]" << endl;
+ }
+
+ //clear all "last" know things
+ m_lastsub="";
+ m_lastattr="";
+ m_inpackage = false;
+ m_inscript = true;
+ m_inclass=false;
+
+ m_lastscriptname=name;
+ m_lastpackage=0;
+ m_lastclass=0;
+
+}
+
+void perlparser::addAttributetoPackage(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addAttributetoPackage [" << name << "]" << endl;
+ VariableDom var = m_model->create<VariableModel>();
+ var->setName(name);
+ var->setFileName( fileName );
+ var->setStartPosition( lineNr, 0 );
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasVariable(var->name()))
+ m_lastpackage->addVariable(var);
+ } else {
+ kdDebug(9016) << "addAttributetoPackge[ no m_file]" << endl;
+ }
+
+ m_lastattr=name;
+}
+
+void perlparser::addAttributetoScript(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "addAttributetoScript [" << name << "]" << endl;
+ VariableDom var = m_model->create<VariableModel>();
+ var->setName(name);
+ var->setFileName( fileName );
+ var->setStartPosition( lineNr, 0 );
+ if (m_lastscript) {
+ if (!m_lastscript->hasVariable(var->name()))
+ m_lastscript->addVariable(var);
+ } else {
+ kdDebug(9016) << "addAttributeScript[ no m_file]" << endl;
+ }
+}
+
+void perlparser::addClass(const QString& fileName ,int lineNr)
+{
+ kdDebug(9016) << "addClass [ " << m_lastpackagename << " ]" << endl;
+ if (m_lastpackage->hasClass(m_lastpackagename)) {
+ kdDebug(9016) << "Class already defined" << endl;
+ } else {
+ kdDebug(9016) << "new Class" << endl;
+ ClassDom lastClass = m_model->create<ClassModel>();
+ lastClass->setName(m_lastpackagename);
+ lastClass->setFileName(fileName);
+ lastClass->setStartPosition(lineNr, 0);
+ m_lastpackage->addClass(lastClass);
+ m_lastclass=lastClass;
+ m_inclass=true;
+ }
+}
+
+void perlparser::addConstructor(const QString& fileName ,int lineNr ,const QString& name)
+{
+ kdDebug(9016) << "set Constructor["<< name << "]" << endl;
+
+ FunctionDom method;
+
+ if (m_lastpackage->hasFunction(name)) {
+ //remove last sub frompackage scope
+ method = m_lastpackage->functionByName(name)[0];
+ method->getStartPosition(&lineNr,0);
+ m_lastpackage->removeFunction(method);
+ }
+ method = m_lastclass->functionByName(name)[0];
+ if (!method) {
+ kdDebug(9016) << "add new Constructor["<< name << ", " << lineNr << "]" << endl;
+ method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ m_lastclass->addFunction(method);
+ }
+ method->setStatic(true);
+ //update class position
+ m_lastclass->setStartPosition(lineNr,0);
+}
+
+void perlparser::addGlobalSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addGlobalSub[ " << name << "]" << endl;
+
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ method->setStatic(true);
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasFunction(method->name()))
+ m_lastpackage->addFunction(method);
+ } else {
+ kdDebug(9016) << "addGlobalsub[ no m_lastpackage]" << endl;
+ }
+
+ //also add seperate to namespace
+ addPackageSub(fileName,lineNr,name,privatesub);
+ m_lastsub=name;
+}
+
+void perlparser::addScriptSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+
+{
+ kdDebug(9016) << "addScriptSub[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if(m_lastscript) {
+ m_lastscript->addFunction(method);
+ } else {
+ }
+
+ m_lastsub=name;
+}
+
+void perlparser::addClassMethod(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addClassMethod[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ method->setVirtual(true);
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastclass) {
+ if (!m_lastclass->hasFunction(method->name()))
+ m_lastclass->addFunction(method);
+ } else {
+ kdDebug(9016) << "addClassmethod[ no m_lastclass]" << endl;
+ }
+
+// addPackageSub(fileName,lineNr,name,privatesub);
+ m_lastsub=name;
+}
+
+void perlparser::addPackageSub(const QString& fileName ,int lineNr ,const QString& name ,bool privatesub)
+{
+ kdDebug(9016) << "addPackageSub[ " << name << "]" << endl;
+ FunctionDom method = m_model->create<FunctionModel>();
+ method->setName(name);
+ method->setFileName( fileName );
+ method->setStartPosition( lineNr, 0 );
+ if (privatesub)
+ method->setAccess(CodeModelItem::Private);
+ if (m_lastpackage) {
+ if (!m_lastpackage->hasFunction(method->name()))
+ m_lastpackage->addFunction(method);
+ } else {
+ kdDebug(9016) << "addPackageSub[ no m_file]" << endl;
+ }
+ m_lastsub=name;
+}
+
+void perlparser::addParentClass(const QString& parent)
+{
+ kdDebug(9016) << "addParentClass[ " << parent << "]" << endl;
+ if (m_lastclass) {
+ m_lastclass->addBaseClass(parent);
+ } else {
+ kdDebug(9016) << "addParentClass[ no m_lastclass]" << endl;
+ }
+}
+
+void perlparser::addUseLib(const QString& lib)
+{
+ if (!m_model->hasFile(lib)) {
+ if (m_usefiles.findIndex(lib) == -1) {
+ //only add if not already parsed or in the list
+ kdDebug(9016) << "add lib for later parsing [" << lib << "]" << endl;
+ m_usefiles.append(lib);
+ }
+ }
+}
+
+void perlparser::getPerlINC() {
+
+
+ m_INClist.clear();
+
+ QString cmd = "/usr/bin/perl -e\" print join('|',@INC);\"";
+ QString result;
+
+ FILE *fd = popen(cmd.local8Bit().data(), "r");
+ char buffer[4090];
+ QByteArray array;
+
+ while (!feof(fd)) {
+ int n = fread(buffer, 1, 2048, fd);
+ if (n == -1) {
+ pclose(fd);
+ return;
+ }
+ array.setRawData(buffer, n);
+ result=QString::QString(array);
+ array.resetRawData(buffer, n);
+ }
+ pclose(fd);
+ //get INC list so we can use it to parse "use" modules
+ m_INClist = QStringList::split(QString("|"),result);
+ kdDebug(9016) << "INC " << m_INClist.size() << " "<< result << endl;
+}
+
+QString perlparser::findLib( const QString& lib)
+{
+ QString result;
+
+ QString file=lib;
+ file.replace( QRegExp("::"), QString("/"));
+
+ //find the correct path by using the INC list
+ QStringList::Iterator inc = m_INClist.begin();
+ while((inc != m_INClist.end()) && (result.isEmpty()) ) {
+ QFileInfo fi((*inc) + "/" + file + ".pm");
+ if ( fi.exists() ) {
+ result = (*inc) + "/" + file + ".pm";
+ }
+ ++inc;
+ }
+ return result;
+}
+
diff --git a/languages/perl/perlparser.h b/languages/perl/perlparser.h
new file mode 100644
index 00000000..01ded7d8
--- /dev/null
+++ b/languages/perl/perlparser.h
@@ -0,0 +1,87 @@
+/***************************************************************************
+ perlparser.h - description
+ -------------------
+ begin : Sun Nov 2 2003
+ copyright : (C) 2003 by luc
+ email : luc@lieve
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef PERLPARSER_H
+#define PERLPARSER_H
+
+#include "kdevlanguagesupport.h"
+#include <codemodel.h>
+
+
+/**perl source to classview parser
+ *@author luc
+ */
+
+class perlparser {
+ public:
+ perlparser(KDevCore* core,CodeModel* model, QString interpreter);
+ perlparser();
+ ~perlparser();
+
+ void initialParse();
+ void parse(const QString &fileName);
+ void parseLines(QStringList* lines,const QString& fileName);
+ const QStringList UseFiles();
+ QString findLib( const QString& lib);
+
+ private:
+ //global functions to add to ClassStore
+ void addPackage(const QString& fileName ,int lineNr , const QString& name);
+ void addAttributetoScript(const QString& fileName ,int lineNr ,const QString& name);
+ void addAttributetoPackage(const QString& fileName ,int lineNr ,const QString& name);
+ void addClass(const QString& fileName ,int lineNr );
+ void addConstructor(const QString& fileName ,int lineNr ,const QString& methodname);
+ void addGlobalSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addScriptSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addClassMethod(const QString& fileName ,int lineNr , const QString& name , bool privatesub);
+ void addPackageSub(const QString& fileName ,int lineNr , const QString& name, bool privatesub);
+ void addParentClass(const QString& parent);
+ void addScript(const QString& fileName ,int lineNr , const QString& name);
+ void addUseLib(const QString& lib);
+ void getPerlINC();
+
+ bool m_inpackage;
+ bool m_inscript;
+ bool m_inclass;
+
+ QString m_lastsub;
+ QString m_lastparentclass;
+ QString m_lastattr;
+ QString m_lastpackagename;
+ QString m_lastscriptname;
+
+ NamespaceDom m_lastscript;
+ NamespaceDom m_lastpackage;
+ ClassDom m_lastclass;
+
+ //CodeModel
+ CodeModel* m_model;
+ KDevCore* m_core;
+ FileDom m_file;
+
+ //this willhav a list of INC paths
+ QStringList m_INClist;
+ //this will get a list off all files "use" in the perl files
+ //and need additional parsing to include the classes in the classview
+ QStringList m_usefiles;
+
+ QString m_interpreter;
+
+
+};
+
+#endif
diff --git a/languages/perl/perlsupportpart.cpp b/languages/perl/perlsupportpart.cpp
new file mode 100644
index 00000000..4305644e
--- /dev/null
+++ b/languages/perl/perlsupportpart.cpp
@@ -0,0 +1,330 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "perlsupportpart.h"
+
+#include <qfileinfo.h>
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kdevgenericfactory.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <qregexp.h>
+#include <codemodel.h>
+#include <qprogressbar.h>
+#include <kstatusbar.h>
+#include "kdevmainwindow.h"
+
+#include <kprocess.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevplugininfo.h"
+#include "kdevappfrontend.h"
+//#include "classstore.h"
+//#include "parsedclass.h"
+//#include "parsedmethod.h"
+//#include "parsedscript.h"
+#include "domutil.h"
+//#include "programmingbycontract.h"
+
+typedef KDevGenericFactory<PerlSupportPart> PerlSupportFactory;
+static const KDevPluginInfo data("kdevperlsupport");
+K_EXPORT_COMPONENT_FACTORY( libkdevperlsupport, PerlSupportFactory( data ) )
+
+PerlSupportPart::PerlSupportPart(QObject *parent, const char *name, const QStringList &)
+ : KDevLanguageSupport(&data, parent, name ? name : "PerlSupportPart")
+{
+ setInstance(PerlSupportFactory::instance());
+
+ setXMLFile("kdevperlsupport.rc");
+
+ connect( core(), SIGNAL(projectOpened()), this, SLOT(projectOpened()) );
+ connect( core(), SIGNAL(projectClosed()), this, SLOT(projectClosed()) );
+ connect( partController(), SIGNAL(savedFile(const KURL&)),
+ this, SLOT(savedFile(const KURL&)) );
+
+ KAction *action;
+
+ action = new KAction( i18n("Execute Main Program"), "exec", 0,
+ this, SLOT(slotExecute()),
+ actionCollection(), "build_exec" );
+ action->setToolTip( i18n("Runs the Perl program") );
+
+ action = new KAction( i18n("Execute String..."), "exec", 0,
+ this, SLOT(slotExecuteString()),
+ actionCollection(), "build_execstring" );
+ action->setToolTip( i18n("Executes a string as Perl code") );
+
+ action = new KAction( i18n("Start Perl Interpreter"), "exec", 0,
+ this, SLOT(slotStartInterpreter()),
+ actionCollection(), "build_runinterpreter" );
+ action->setToolTip( i18n("Starts the Perl interpreter without a program") );
+
+ action = new KAction( i18n("Find Perl Function Documentation..."), 0,
+ this, SLOT(slotPerldocFunction()),
+ actionCollection(), "help_perldocfunction" );
+ action->setToolTip( i18n("Show the documentation page of a Perl function") );
+
+ action = new KAction( i18n("Find Perl FAQ Entry..."), 0,
+ this, SLOT(slotPerldocFAQ()),
+ actionCollection(), "help_perldocfaq" );
+ action->setToolTip( i18n("Show the FAQ entry for a keyword") );
+
+ //perl parser for codemodel
+ m_parser = new perlparser(core(),codeModel(),interpreter());
+}
+
+
+PerlSupportPart::~PerlSupportPart()
+{
+ if (project())
+ projectClosed();
+
+ delete m_parser;
+ m_parser=0;
+}
+
+
+void PerlSupportPart::projectOpened()
+{
+ kdDebug(9007) << "projectOpened()" << endl;
+
+ connect( project(), SIGNAL(addedFilesToProject(const QStringList &)),
+ this, SLOT(addedFilesToProject(const QStringList &)) );
+ connect( project(), SIGNAL(removedFilesFromProject(const QStringList &)),
+ this, SLOT(removedFilesFromProject(const QStringList &)) );
+
+ // We want to parse only after all components have been
+ // properly initialized
+ QTimer::singleShot(0, this, SLOT(initialParse()));
+}
+
+
+void PerlSupportPart::projectClosed()
+{
+}
+
+void PerlSupportPart::maybeParse(const QString fileName)
+{
+ QFileInfo fi(fileName);
+ QString path = fi.filePath();
+ QString extension = fi.extension();
+ if (extension == "pl" || extension == "pm") {
+ kdDebug(9016) << "maybe " << fileName << endl;
+ removeWithReference(fileName);
+ m_parser->parse(fileName);
+ emit addedSourceInfo( fileName);
+ }
+}
+
+void PerlSupportPart::addedFilesToProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "addedFilesToProject()" << endl;
+
+ QStringList::ConstIterator it;
+
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ maybeParse(project()->projectDirectory() + "/" + ( *it ));
+ }
+}
+
+
+void PerlSupportPart::removedFilesFromProject(const QStringList &fileList)
+{
+ kdDebug(9016) << "removedFilesFromProject()" << endl;
+ QStringList::ConstIterator it;
+ for ( it = fileList.begin(); it != fileList.end(); ++it )
+ {
+ QString fileName = project()->projectDirectory() + "/" + ( *it );
+ removeWithReference(fileName);
+ }
+ emit updatedSourceInfo();
+}
+
+
+void PerlSupportPart::savedFile(const KURL &fileName)
+{
+ Q_UNUSED( fileName.path() );
+#if 0 // not needed anymore
+ kdDebug(9016) << "savedFile()" << endl;
+
+ if (project()->allFiles().contains(fileName.mid ( project()->projectDirectory().length() + 1 ))) {
+ maybeParse(fileName);
+ emit updatedSourceInfo();
+ }
+#endif
+}
+
+
+KDevLanguageSupport::Features PerlSupportPart::features()
+{
+ return KDevLanguageSupport::Features(Classes | Functions | Variables | Namespaces | /*Scripts | */NewClass | AddMethod | AddAttribute /*| NewScript*/);
+// return Functions;
+}
+
+QString PerlSupportPart::interpreter()
+{
+ QString prog = DomUtil::readEntry(*projectDom(), "/kdevperlsupport/run/interpreter");
+ if (prog.isEmpty())
+ prog = "perl";
+
+ return prog;
+}
+
+
+void PerlSupportPart::startApplication(const QString &program)
+{
+ bool inTerminal = DomUtil::readBoolEntry(*projectDom(), "/kdevperlsupport/run/terminal");
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), program, inTerminal);
+}
+
+
+void PerlSupportPart::slotExecute()
+{
+ QString program = project()->mainProgram();
+ QString cmd = interpreter() + " " + program;
+ startApplication(cmd);
+}
+
+
+void PerlSupportPart::slotStartInterpreter()
+{
+ startApplication(interpreter());
+}
+
+
+void PerlSupportPart::slotExecuteString()
+{
+ bool ok;
+ QString cmd = KInputDialog::getText(i18n("String to Execute"), i18n("String to execute:"), QString::null, &ok, 0);
+ if (ok) {
+ cmd.prepend("'");
+ cmd.append("'");
+ startApplication(cmd);
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFunction()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show Perl Documentation"), i18n("Show Perl documentation for function:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:functions/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+
+
+void PerlSupportPart::slotPerldocFAQ()
+{
+ bool ok;
+ QString key = KInputDialog::getText(i18n("Show FAQ Entry"), i18n("Show FAQ entry for keyword:"), "", &ok, 0);
+ if (ok && !key.isEmpty()) {
+ QString url = "perldoc:faq/";
+ url += key;
+ partController()->showDocument(KURL(url));
+ }
+}
+KMimeType::List PerlSupportPart::mimeTypes( )
+{
+ KMimeType::List list;
+ KMimeType::Ptr mime = KMimeType::mimeType( "application/x-perl" );
+ if( mime )
+ list << mime;
+ return list;
+}
+
+void PerlSupportPart::initialParse()
+{
+ kdDebug(9016) << "initialParse()" << endl;
+
+ if (project()) {
+ //copy from cpp support : give user some feedback
+ mainWindow()->statusBar()->message( i18n("Updating...") );
+ kapp->processEvents( );
+
+ kapp->setOverrideCursor(waitCursor);
+ QStringList files = project()->allFiles();
+ m_parser->initialParse();
+
+ //progress bar
+ QProgressBar* bar = new QProgressBar( files.count( ), mainWindow( )->statusBar( ) );
+ bar->setMinimumWidth( 120 );
+ bar->setCenterIndicator( true );
+ mainWindow( )->statusBar( )->addWidget( bar );
+ bar->show( );
+ int n = 0;
+ for (QStringList::Iterator it = files.begin(); it != files.end() ;++it) {
+// kdDebug(9016) << "maybe parse " << project()->projectDirectory() + "/" + (*it) << endl;
+ maybeParse(project()->projectDirectory() + "/" + *it);
+ //update progress bar
+ bar->setProgress( n++ );
+ if( (n%5) == 0 )
+ kapp->processEvents();
+ }
+ parseUseFiles();
+ emit updatedSourceInfo();
+
+ //remove progressbar
+ mainWindow( )->statusBar( )->removeWidget( bar );
+ delete bar;
+ kapp->restoreOverrideCursor();
+ mainWindow()->statusBar()->message( i18n("Done") );
+
+ } else {
+ kdDebug(9016) << "No project" << endl;
+ }
+}
+
+void PerlSupportPart::removeWithReference( const QString & fileName )
+{
+ kdDebug(9016) << "remove with references: " << fileName << endl;
+ //m_timestamp.remove( fileName );
+ if( !codeModel()->hasFile(fileName) )
+ return;
+
+ emit aboutToRemoveSourceInfo( fileName );
+ codeModel()->removeFile( codeModel()->fileByName(fileName) );
+}
+
+void PerlSupportPart::parseUseFiles()
+{
+ kdDebug(9016) << "parse addional libs" << endl;
+ return;
+ QString filename;
+ QStringList m_usefiles = m_parser->UseFiles();
+
+ //parse addional use files
+ for (QStringList::Iterator it = m_usefiles.begin(); it != m_usefiles.end() ;++it)
+ {
+ filename = m_parser->findLib(*it);
+ //if something found , parse it
+ if (!filename.isEmpty()) {
+ //kdDebug(9016) << "found " << filename << endl;
+ maybeParse(filename);
+ }
+ }
+}
+
+#include "perlsupportpart.moc"
diff --git a/languages/perl/perlsupportpart.h b/languages/perl/perlsupportpart.h
new file mode 100644
index 00000000..91765a47
--- /dev/null
+++ b/languages/perl/perlsupportpart.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2001-2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PERLSUPPORTPART_H_
+#define _PERLSUPPORTPART_H_
+
+#include "kdevlanguagesupport.h"
+#include <codemodel.h>
+#include "perlparser.h"
+
+class PerlSupportPart : public KDevLanguageSupport
+{
+ Q_OBJECT
+
+public:
+ PerlSupportPart( QObject *parent, const char *name, const QStringList & );
+ ~PerlSupportPart();
+
+protected:
+ virtual Features features();
+ virtual KMimeType::List mimeTypes();
+
+private slots:
+ void projectOpened();
+ void projectClosed();
+ void savedFile(const KURL &fileName);
+ void addedFilesToProject(const QStringList &fileList);
+ void removedFilesFromProject(const QStringList &fileList);
+ void slotExecute();
+ void slotExecuteString();
+ void slotStartInterpreter();
+
+ // Internal
+ void initialParse();
+ void slotPerldocFunction();
+ void slotPerldocFAQ();
+
+private:
+ QString interpreter();
+ void startApplication(const QString &program);
+ void maybeParse(const QString fileName);
+ void parse(const QString &fileName);
+ void parseLines(QStringList* lines,const QString& fileName);
+ void removeWithReference( const QString & fileName );
+ void parseUseFiles();
+ //Perl Parser
+ perlparser* m_parser;
+
+};
+
+#endif