Please read and review: Draft of article "Developing custom language plugins for IDEA"

Hello everyone,

A very commonly requested documentation item was an article explaining the
concepts and usage of the IDEA Language API. Well, now there is one - or
at least, a draft for one. Before the article is published officially, I'd
like to give you the chance to review and comment on it.

What I'm most interested in is:
- if you have already used the Language API - are there any difficulties
or pitfalls that you encountered and that are not described in the article?
- if you have not used the Language API - does the article give you a clear
idea of how to use it, or are there any concepts that should be explained
in more detail?

The current draft of the article is posted at:
http://www.yole.ru/CustomLanguagePlugins.html

Thanks in advance for your help!

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


40 comments

Where is this Python language plugin which you mention in your article?
A quick survey of the Plugin Manager and a Google search leave me
unenlightened...

Thanks,
Gordon

--
Gordon Tyler (Software Developer)
Quest Software <http://www.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5, Canada
Voice: (416) 933-5046 | Fax: (416) 933-5001

0

This looks like a great collection of starting points. I have some comments:

Code examples for every step would be great, even 2 lines showing how to
register the file type would improve that section, for example.

I think in the lexer section, "For all other token types, new IElementType
instances are created and associated with a language in which the token type is
used." should be reworded to make it clear that the plugin can use its own
IElementType instances. The current wording implies that IDEA creates them somehow.

Also in lexer section, "for example, if an XML file contains a snippet of Java
code" is unfortunately misleading. I don't believe currently this is possible
without reimplementing XML parser. I think you should use a different example.
In general I think the chameleon paragraph is confusing and its wording could be
improved, and of course an example code would help.

In parser section, "Each pair of markers defines a single node in the AST tree"
could be clearer: "Each pair of markers defines the range of lexer tokens in a
single node in the AST tree" or something like that

I think a small diagram would help PSI section. I've attached a sample, if you
like it I've attached the .graffle file for OmniGraffle.

I'll read the rest of the guide later and probably post more comments.



Attachment(s):
Language API PSI parsing.png
att1.dat
Language API PSI parsing#D6464B
0

Hello Gordon,

GT> Where is this Python language plugin which you mention in your
GT> article? A quick survey of the Plugin Manager and a Google search
GT> leave me unenlightened...

Still nowhere but my personal Subversion repository... now that the article
draft is done, I'll focus on the remaining few issues that need fixing before
I can release the plugin.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Dmitry Jemerov (JetBrains) wrote:

Hello Gordon,

GT> Where is this Python language plugin which you mention in your
GT> article? A quick survey of the Plugin Manager and a Google search
GT> leave me unenlightened...

Still nowhere but my personal Subversion repository... now that the
article draft is done, I'll focus on the remaining few issues that need
fixing before I can release the plugin.


Ah! Now I recall. You mentioned this before briefly. I look forward to
its release 8)

Ciao,
Gordon

--
Gordon Tyler (Software Developer)
Quest Software <http://www.quest.com/>
260 King Street East, Toronto, Ontario M5A 4L5, Canada
Voice: (416) 933-5046 | Fax: (416) 933-5001

0

I'm excited about this. Dmitry, can I help with this project? I am looking to
make a plugin for internal build files, which are stripped down Python scripts.
Maybe we could make a java.net or sourceforge project out of it. I've been too
nervous about integrating Jython's parser (based on JavaCC) to even begin the
plugin I want to write.

Dmitry Jemerov (JetBrains) wrote:

Hello Gordon,

GT> Where is this Python language plugin which you mention in your
GT> article? A quick survey of the Plugin Manager and a Google search
GT> leave me unenlightened...

Still nowhere but my personal Subversion repository... now that the
article draft is done, I'll focus on the remaining few issues that need
fixing before I can release the plugin.

0

It's probably worth a short section on how to write inspections for custom file types, and another on how to write quickfixes/intentions. (I'm actually not quite sure how to do the latter myself. I would need functionality equivalent to the ElementFactory.createExpressionFromText() or ElementFactory.createStatementFromText(), but don't seem to be able to find it in the API).

--Dave Griffith

0

Hello Keith,

KL> I'm excited about this. Dmitry, can I help with this project? I am
KL> looking to make a plugin for internal build files, which are
KL> stripped down Python scripts. Maybe we could make a java.net or
KL> sourceforge project out of it. I've been too nervous about
KL> integrating Jython's parser (based on JavaCC) to even begin the
KL> plugin I want to write.

As it's more of my personal project than an official JetBrains thing, I wouldn't
mind getting help at all. :) But I'd like to make the initial release first,
before finding a public place to host it.

I didn't integrate the Jython parser, by the way - I hand-coded my own, JavaScript-plugin-style.
It's quite tedious, but not too hard.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Hello Dave,

DG> It's probably worth a short section on how to write inspections for
DG> custom file types, and another on how to write
DG> quickfixes/intentions.

Quickfixes are mentioned in a section on syntax and error highlighting...
inspections are worth adding, indeed. (All IDEA gives you in this regard
is LocalInspectionTool.checkFile(), but you can build a lot from that.)

DG> (I'm actually not quite sure how to do the
DG> latter myself. I would need functionality equivalent to the
DG> ElementFactory.createExpressionFromText() or
DG> ElementFactory.createStatementFromText(), but don't seem to be able
DG> to find it in the API).

That doesn't need to be in the API - check out how JavaScript plugin does
that in JSChangeUtil.createNameIdentifier(), for example.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Dave Griffith wrote:

It's probably worth a short section on how to write inspections for custom
file types, and another on how to write quickfixes/intentions. (I'm actually
not quite sure how to do the latter myself. I would need functionality
equivalent to the ElementFactory.createExpressionFromText() or
ElementFactory.createStatementFromText(), but don't seem to be able to find
it in the API).

--Dave Griffith


Dave, the current hack to do it is to create a temporary file of the specified
type, and insert whatever declarations you need.

0

Hi Dmitry,

I think this is a very good start to give people a basic idea of what is possible and how.
I also agree with Keith that some code snippets would be nice. That makes it easier to get
an image of how things have to be done while reading the document. Adding more diagrams
and charts like Keith did might also be a good idea.

Here are some other things that came to my mind:

- Make it clear that idea.jar has to be added to the IDEA-JDK, not as a (Module) Library
which will cause problems.

- Add some explanation what the difference between Marker.drop() and Marker.rollbackTo()
is. It's 95% clear from their names, but another sentence or two wouldn't hurt.

- Mention how to use Marker.precede() to deal with recursive productions that can not be
linearized due to precedence issues:

OrExpr ::= AndExpr | OrExpr 'or' AndExpr

boolean parseOrExpr(PsiBuilder builder) {
PsiBuilder.Marker expr = builder.mark();
if (!parseAndExpression(builder)) {
expr.drop();
return false;
}
while (builder.getTokenType() == TokenTypes.OR) {
builder.advanceLexer();
if (!parseAndExpression(builder)) {
builder.error("expression expected");
}
expr.done(ElementTypes.BINARY_EXPRESSION);
expr = expr.precede();
}
expr.drop();
return true;
}

- Mention that all tokens must be processed by the parser, even if they are unexpected and
come after the start production of the grammar has been completely matched. Otherwise
you'll get some weird assertion for things like

Program ::= "program" Identifier ";" Block "."

program p;
begin
]]>
end.
... some unexpected tokens here ...

- You say that "All PSI elements which work as references need to implement the
com.intellij.psi.PsiReference interface". That's AFAIK not really true. PsiReferences and
PsiElements are independent concepts, which is IMO important to understand. A PsiElement
can hold a reference to other elements, but the element itself doesn't need to be one
(though this seems to be the common way to implement a reference).

This became obvious to me through an answer I got from Maxim some time ago: "As the matter
of fact PsiReference is not a PsiElement but rather array of references might be returned
by arbitrary PSI element. For instance, XML attribute value element may return references
to java class if there's something in it's value that looks like qualified class name."

The XML attribute value itself isn't a reference, but may provide one.

It should be made clear that this is what PsiElement.getReference[s]() is for, and that
those methods do NOT what PsiSearchHelper.findReferences() does.

- Add some description about how getVariants() and code completion play together and that
it's possible to return Strings and PsiElements to get an icon in the lookup list. It's
already in PsiReference's JavaDoc (which doesn't mention the possibility to return simple
Strings btw), but the code completion topic should be mentioned in this document as well.

- The Code Formatting chapter definitely needs a reasonably simple example to show how the
things explained work together. The description is quite good to understand, but without
seeing any code it's too theoretical. The JS formatter is IMO already too complex to get a
quick idea of how it works.


Sascha

0

We're in the probably-quite-unusual sitation where we have a project that
contains both Python and Jython code. I suspect it's asking too much for
your Python plugin to optionally support Jython extensions as well, but how
difficult do you think it would be for someone else to add that kind of functionality
to your plugin down the track?

Regardless, I'm looking forward to testing this once it is released.

Chris

Hello Keith,

KL>> I'm excited about this. Dmitry, can I help with this project? I am
KL>> looking to make a plugin for internal build files, which are
KL>> stripped down Python scripts. Maybe we could make a java.net or
KL>> sourceforge project out of it. I've been too nervous about
KL>> integrating Jython's parser (based on JavaCC) to even begin the
KL>> plugin I want to write.
KL>>

As it's more of my personal project than an official JetBrains thing,
I wouldn't mind getting help at all. :) But I'd like to make the
initial release first, before finding a public place to host it.

I didn't integrate the Jython parser, by the way - I hand-coded my
own, JavaScript-plugin-style. It's quite tedious, but not too hard.



0

Hello Chris,

CM> We're in the probably-quite-unusual sitation where we have a project
CM> that contains both Python and Jython code. I suspect it's asking too
CM> much for your Python plugin to optionally support Jython extensions
CM> as well, but how difficult do you think it would be for someone else
CM> to add that kind of functionality to your plugin down the track?

Given that the plugin runs in a Java IDE, support for the version of the
language which also runs under Java seems to be quite natural, so the support
for Jython extensions was in the original plan of my plugin.

I don't have too much time to work on the plugin now, so I don't know when
I'll be able to implement that myself, but it will be definitely possible
for other developers to add that functionality.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Hello Sascha,

Thanks a lot for your comments! I've uploaded a new draft of the article,
which includes revisions based on your comments, to the same URL.

Some other comments are below.

SW> I think this is a very good start to give people a basic idea of
SW> what is possible and how. I also agree with Keith that some code
SW> snippets would be nice. That makes it easier to get an image of how
SW> things have to be done while reading the document. Adding more
SW> diagrams and charts like Keith did might also be a good idea.

As for the snippets - I don't think that random code snippets not related
to any specific language would provide much value... The best thing to have,
in my opinion, would be cross-referenced HTMLized source code of some language
plugins (JavaScript, maybe Python, maybe others) and links to that code from
thearticle.

As for diagrams - I'm not much of an artist, but I gave it a try. :) If
the diagram confuses more than helps, we can always drop it.

SW> - Mention how to use Marker.precede() to deal with recursive
SW> productions that can not be linearized due to precedence issues:

Unfortunately I don't quite understand how to describe this clearly... the
feature looks quite obvious when you see how it's used, but I don't know
how to explain it adequately with words. "Linearizing recursive productions"
sounds a bit too complex for me. :)

SW> - Add some description about how getVariants() and code completion
SW> play together and that it's possible to return Strings and
SW> PsiElements to get an icon in the lookup list. It's already in
SW> PsiReference's JavaDoc (which doesn't mention the possibility to
SW> return simple Strings btw), but the code completion topic should be
SW> mentioned in this document as well.

I somehow completely forgot about the code completion topic - I meant to
write it, for sure, but eventually didn't. The topic is in there now.

SW> - The Code Formatting chapter definitely needs a reasonably simple
SW> example to show how the things explained work together. The
SW> description is quite good to understand, but without seeing any code
SW> it's too theoretical. The JS formatter is IMO already too complex to
SW> get a quick idea of how it works.

In order to create a reasonably simple formatter example, a language with
relatively simple formatting rules is needed. Maybe you can suggest one?
Any language with a C-style syntax quickly turns out to require support for
several dozen code style rules, and becomes no simpler than the JavaScript
formatter...

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Hello Keith,

KL> This looks like a great collection of starting points. I have some
KL> comments:

Thanks a lot for your comments! I've included changes based on them in the
new draft of the article, which I've uploaded at the same URL.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Could you also give an short note of the various utility classes?
For example PsiUtil provides many ready-to-use methods.

0

Hello Sven,

SS> Could you also give an short note of the various utility classes?
SS> For example PsiUtil provides many ready-to-use methods.

I think that description of utility classes lies outside the scope of this
article - the utility classes are better described in the JavaDoc documentation.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

I didn't mean that you should describe the various methods - JavaDoc is
just fine for them. The problem is that if you don't know that they are
there, you can't use them. A small overview like "PsiUtil contains
useful methods for dealing with psi-related issues" may help.
I found PsiUtil.isApplicable() by accident and it was exactly what I needed.


Dmitry Jemerov (JetBrains) schrieb:

Hello Sven,

SS> Could you also give an short note of the various utility classes?
SS> For example PsiUtil provides many ready-to-use methods.

I think that description of utility classes lies outside the scope of
this article - the utility classes are better described in the JavaDoc
documentation.

0

Hi Dimitry,

As for the snippets - I don't think that random code snippets not
related to any specific language would provide much value... The best
thing to have, in my opinion, would be cross-referenced HTMLized source
code of some language plugins (JavaScript, maybe Python, maybe others)
and links to that code from thearticle.


Well, that sounds good. It doesn't clutter the article and still provides something
substantial to see the explained things in detail. +1 for HTMLized source references.

The links to the corresponding JavaDoc for interfaces, etc. are nice as well, but they
should open in their own window to be able to open the article and the docs/examples side
by side.

As for diagrams - I'm not much of an artist, but I gave it a try. :) If
the diagram confuses more than helps, we can always drop it.


Haha, I'm not either, but the diagram you put up looks good IMO.

SW> - Mention how to use Marker.precede() to deal with recursive
SW> productions that can not be linearized due to precedence issues:

Unfortunately I don't quite understand how to describe this clearly...
the feature looks quite obvious when you see how it's used, but I don't
know how to explain it adequately with words. "Linearizing recursive
productions" sounds a bit too complex for me. :)


That's true, but I still think it should be covered in the article somehow. Here's
something I dug out of the forums, originally posted by Maxim:

"This method is useful for right-to-left parsing when you don't know
how many markers you need at certain position until you read more input. Example is binary
expression parsing like abc should be treated as (a(bc)) thus you need two markers at
'a' position, which fact isn't known until you get to 'c' lexem."

I think this explanation fits quite well, and when linked to some example code in the JS
plugin it should be clear what the method is useful for.

SW> - The Code Formatting chapter definitely needs a reasonably simple
SW> example to show how the things explained work together. The
SW> description is quite good to understand, but without seeing any code
SW> it's too theoretical. The JS formatter is IMO already too complex to
SW> get a quick idea of how it works.

In order to create a reasonably simple formatter example, a language
with relatively simple formatting rules is needed. Maybe you can suggest
one? Any language with a C-style syntax quickly turns out to require
support for several dozen code style rules, and becomes no simpler than
the JavaScript formatter...


True. What about plain text? This could show the bare minimum requirements for a formatter
with wrapping at the right margin and smart cursor positioning when pressing enter (cursor
goes to the position of the first non-whitespace character in the line above). Would that
be possible to realize with the Formatter-API and reasonably simple?

Sascha

PS: The title of the article ends a little abruptly: "Developing Custom Language Plugi".
You may want to fix that ;)

0

Hello Sascha,

SW> The links to the corresponding JavaDoc for interfaces, etc. are nice
SW> as well, but they should open in their own window to be able to open
SW> the article and the docs/examples side by side.

fixed

>> SW> - Mention how to use Marker.precede() to deal with recursive SW>
>> productions that can not be linearized due to precedence issues:
>>
>> Unfortunately I don't quite understand how to describe this
>> clearly... the feature looks quite obvious when you see how it's
>> used, but I don't know how to explain it adequately with words.
>> "Linearizing recursive productions" sounds a bit too complex for me.
>> :)
>>
SW> That's true, but I still think it should be covered in the article
SW> somehow. Here's something I dug out of the forums, originally posted
SW> by Maxim:
SW>
SW> "This method is useful for right-to-left parsing
SW> when you don't know how many markers you need at certain position
SW> until you read more input. Example is binary expression parsing like
SW> abc should be treated as (a(bc)) thus you need two markers at
SW> 'a' position, which fact isn't known until you get to 'c' lexem."

Added, with changes to make the explanation actually correct. :)

>> SW> - The Code Formatting chapter definitely needs a reasonably
>> simple
>> SW> example to show how the things explained work together. The
>> SW> description is quite good to understand, but without seeing any
>> code
>> SW> it's too theoretical. The JS formatter is IMO already too complex
>> to
>> SW> get a quick idea of how it works.
>> In order to create a reasonably simple formatter example, a language
>> with relatively simple formatting rules is needed. Maybe you can
>> suggest one? Any language with a C-style syntax quickly turns out to
>> require support for several dozen code style rules, and becomes no
>> simpler than the JavaScript formatter...
>>
SW> True. What about plain text? This could show the bare minimum
SW> requirements for a formatter with wrapping at the right margin and
SW> smart cursor positioning when pressing enter (cursor goes to the
SW> position of the first non-whitespace character in the line above).
SW> Would that be possible to realize with the Formatter-API and
SW> reasonably simple?

There is one little problem with that, namely IDEADEV-2140. :) Once this
is fixed, I think I can give it a try.

SW> PS: The title of the article ends a little abruptly: "Developing
SW> Custom Language Plugi". You may want to fix that ;)

Fixed. Stupid FrontPage. :)

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Dmitry Jemerov (JetBrains) wrote:

SW> PS: The title of the article ends a little abruptly: "Developing
SW> Custom Language Plugi". You may want to fix that ;)

Fixed. Stupid FrontPage. :)


Cool, except that now the links in the table of contents also open in another window.
Those should of course stay in the same window ;)

Sascha

0

Hello Sascha,

SW> Cool, except that now the links in the table of contents also open
SW> in another window. Those should of course stay in the same window ;)

Fixed, thanks.

I've uploaded a new (likely final) draft to the same URL, reviewed by Max
Shafirov, and with links to cross-referenced source code of the JavaScript
plugin.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Hi Dmitry,

Any chance we could have an update on when we might see this plugin released?

Given that the plugin runs in a Java IDE, support for the version of
the language which also runs under Java seems to be quite natural, so
the support for Jython extensions was in the original plan of my
plugin.

I don't have too much time to work on the plugin now, so I don't know
when I'll be able to implement that myself, but it will be definitely
possible for other developers to add that functionality.



0

Easy Money THIS IS AN INVESTMENT OPPORTUNITY FOR SERIOUS PEOPLE ONLY!!! HOW TO TURN $6 INTO $6,000!!!!!!
READING THIS COULD CHANGE YOUR LIFE IT CHANGED MINE... I found this on a bulletin board and decided to try it. A little
while Back, I was browsing through newsgroups, just like you are now, and Came across an article similar to this that said you could
make Thousands of dollars within weeks with only an initial investment of $6.00! So I thought, Yeah right, this must be a scam, but like
most of Us, I was curious, so I kept reading. Anyway, it said that you send $1.00 to each of the 6 names and address stated in the
article. You Then place your own name and address in the bottom of the list at ..6, And post the article in at least 200 newsgroups.
(There are thousands) No catch, that was it. So after thinking it over, and talking to a few People first, I thought about trying it. I
figured: what have I got to Lose except 6 stamps and $6.00, right? Then I invested the measly $6.00. Well GUESS WHAT!! Within
7 days, I started getting money in the mail I was shocked! I Figured it would end soon, but the money just kept coming in. In my
First week, I made about $25.00. By the end of the second week I had Made a total of over $1,000.00! In the third week I had
over $10,000.00 And it's still growing. This is now my fourth week and I have made a total of just over $42,000.00 and it's still
coming in rapidly. It's certainly worth $6.00, and 6 stamps. I was in a bad economic state before I found this Article... I didn't
believe this really worked until I ACTUALLY started Getting mail from all over the world... I bought everything I needed... This idea
came in the right time exactly :) Let me tell you how this works and most importantly, why it Works....Also, make sure you print a
copy of this article NOW, so you Can get the information off of it as you need it. I promise you that if you follow the directions exactly,
that you will Start making more money than you thought possible by doing something so Easy! Suggestion: Read this entire
message carefully! (print it out or Download it.) Follow the simple directions and watch the money come in! It's easy. It's legal.
And, your investment is only $6.00 (Plus postage) IMPORTANT: This is not a rip-off; it is not indecent; it is not Illegal; and it is
virtually no risk - it really Works!!!! If all of the following instructions are adhered to, you will Receive extraordinary dividends.
PLEASE NOTE: Please follow these directions EXACTLY, and $50,000 or More can be yours in 20 to 60 days. This program
remains successful Because of the HONESTY AND INTEGRITY of the participants. Please continue its success by carefully
adhering to the instructions. You will now become part of the Mail Order business. In this business Your product is not solid and
tangible, it's a service. You are in the Business of developing Mailing Lists. Many large corporations are happy To pay big bucks
for quality lists. However, the money made from the Mailing lists is secondary to the income which is made from people like You
and me asking to be included in that list. Here are the 4 easy Steps to success: STEP 1: Get 6 separate pieces of paper and write
the following on each Piece of paper; PLEASE PUT ME ON YOUR MAILING LIST..along with your name and address. Now get 6
US $1.00 bills and place ONE inside EACH of the 6 pieces of Paper so the bill will not be seen through the envelope (to prevent
Thievery). Next, place one paper in each of the 6 envelopes and seal Them. You should now have 6 sealed envelopes, each with
a piece of Paper stating the above phrase, your name and address, and a $1.00 Bill. What you are doing is creating a service.
THIS IS ABSOLUTELY LEGAL You are requesting a legitimate service and You are paying for it! Like most of us I was a little
skeptical and a Little worried about the legal aspects of it all. So I checked it out with the U.S. Post Office (1-800-725-2161) and
they Confirmed that it is indeed legal! Mail the 6 envelopes to the following addresses:
1) Stephen DeLong - 11682 Hoskins St., Huntington Beach, CA 92649
2) Mike Watt - PO Box 129 Roy City, UT 84067
3) Mike Fogaren Jr. - 5 Waterbury Lane, Easton MA 02356
4) David Barth - 1662 Cypress East Avon, Ohio 44011
5) Michael Zicarelli - 230 Erie Rd Vermilion,Ohio 44089
6) Samuel Corrales – 3200 N 75 St #17 Scottsdale, Az 85251
STEP 2: Now take the ..1 name off the list that you see above, move the
Other names up (6 becomes 5, 5 becomes 4, etc...) and add YOUR NAME as Number 6 on the list. STEP 3: Change anything
you need to, but try to keep this article as Close to original as possible. Now, post your amended article to at Least 200
newsgroups. (I think there are close to 24,000 groups) All You need is 200, but remember, the more you post, the more money
you Make! This is perfectly legal! If you have any doubts, refer to Title 18 Sec. 1302 & 1341 of the Postal lottery laws. Keep a
copy of these steps for yourself and, Whenever you need money, you can use it again and again. PLEASE REMEMBER that
this program remains successful because of the HONESTY AND INTEGRITY of the participants and by their carefully Adhering
to the directions. Look at it this way. If you are of Integrity, the program will continue and the money that so many others Have
received will come your way. NOTE: You may want to retain every name and address sent to you, either On a computer or
hard copy and keep the notes people send you. This VERIFIES that you are truly providing a service. (Also, it might be a
Good idea to wrap the $1 bill in dark paper to reduce the risk of mail Theft). So, as each post is downloaded and the directions
carefully Followed, six members will be reimbursed for their participation as a List Developer with one dollar each. Your name
will move up the list Geometrically so that when your name reaches the ..1 position you will Be receiving thousands of dollars
in CASH!!! What an opportunity for only $6.00 ($1.00 for each of the first Six people listed above) Send it now, add your own name
to The list and you're in business! -


DIRECTIONS FOR HOW TO POST TO NEWSGROUPS----


STEP 1) You do
not need to re-type this entire letter to do your own Posting. Simply put your cursor at the beginning of this letter and Drag your
cursor to the bottom of this document, and select 'copy' from The edit menu. This will copy the entire letter into the computer's
Memory. STEP 2) Open a blank 'notepad' file and place your cursor at the top of The blank page. From the 'edit' menu
select 'paste'. This will paste a Copy of the letter into notepad so that you can add your name to the List. STEP 3) Save your new
notepad file as a .txt file. If you want to do Your postings in different settings, you'll always have this file to go Back to.
STEP 4) Use Netscape or Internet explorer and try searching for various Newsgroups (on-line forums, message boards,
chat sites, discussions.) (Just example you log on any search engine like yahoo.com, google.com, Altavista.com, excite.com
then you search with this subject millionaire Message board? or money making message board? or employment message
Board? or money making discussions? or money making forum? or business Message board? etc. You will find thousand &
thousand message board.) STEP 5) Visit these message boards and post this article as a new Message by highlighting the
text of this letter and selecting paste From the edit menu. Fill in the Subject, this will be the header that Everyone sees as they
scroll through the list of postings in a Particular group, click the post message button. You're done with your First one!
Congratulations...THAT'S IT! All you have to do is jump to Different newsgroups and post away, after you get the hang of it,
it Will take about 30 seconds for each newsgroup! **REMEMBER, THE MORE NEWSGROUPS YOU POST IN,THE MORE
MONEY YOU WILL MAKE!! BUT YOU HAVE TO POST A MINIMUM OF 200** That's it You will begin receiving money from
around the world within Days! You may eventually want to rent a P.O.Box due to the large amount Of mail you will receive.
If you wish to stay anonymous, you can invent A name to use, as long as the postman will deliver it. **JUST MAKE SURE ALL
THE ADDRESSES ARE CORRECT.** Now the WHY part: Out of 200 postings, say I receive only 5 replies (a Very low example).
So then I made $5.00 with my name at ..6 on the Letter. Now, each of the 5 persons who just sent me $1.00 make the MINIMUM
200 postings, each with my name at ..5 and only 5 persons Respond to each of the original 5, that is another $25.00 for me, now
Those 25 each make 200 MINIMUM posts with my name at ..4 and only 5 Replies each, I will bring in an additional $125.00! Now,
those 125 Persons turn around and post the MINIMUM 200 with my name at ..3 and Only receive 5 replies each, I will make an
additional $626.00! OK, now Here is the fun part, each of those 625 persons post a MINIMUM 200 Letters with my name at ..2 and
they each only receive 5 replies, that Just made me $3,125.00!!! Those 3,125 persons will all deliver this Message to 200
newsgroups with my name at ..1 and if still 5 persons per 200 newsgroups react I will receive $15,625,00! With an original
Investment of only $6.00! AMAZING! When your name is no longer on the List, you just take the latest posting in the newsgroups,
and send out Another $6.00 to names on the list, putting your name at number 6 Again. And start posting again. The thing to
remember is: do you Realize that thousands of people all over the world are joining the Internet and reading these articles
everyday?, JUST LIKE YOU are now!! So, can you afford $6.00 and see if it really works?? I think so... People have said,
"What if the plan is played out and no one sends you The money? So what What are the chances of that happening when there
Are tons of new honest users and new honest people who are joining the Internet and newsgroups everyday and are willing to
give it a try? Estimates are at 20,000 to 50,000 new users, every day, with thousands Of those joining the actual internet.
Remember: PLAY FAIRLY and HONESTLY, And this will really work. Good Luck to you all !!!!!!!!!!!!!!!!!!!!

-1

Hi Dmitry,

Any chance of a progress update on your Python plugin? Even releasing a build
that was only alpha quality would be appreciated.

Hello Gordon,

GT>> Where is this Python language plugin which you mention in your
GT>> article? A quick survey of the Plugin Manager and a Google search
GT>> leave me unenlightened...
GT>>

Still nowhere but my personal Subversion repository... now that the
article draft is done, I'll focus on the remaining few issues that
need fixing before I can release the plugin.



0

Any chance of a progress update on your Python plugin? Even releasing a
build that was only alpha quality would be appreciated.

Yes, it would be nice to know what's the status of it.
It was promised a long time ago, and that would be the only "clean" example of
the fesibility of the (Open)LanguageAPI & co anyway, since Javascript plug-in is using
too much "internal magic".


Ahmed.

0

Hello Chris,

Keith Lea now also participates in the work on the plugin, and we have created
a java.net project for it. However, the project is still in the incubator,
and as far as I understand, it means that it's not publically accessible
and only the project members have access to its content.

If anyone is interested in contributing to the plugin, you can send me your
java.net account IDs to me at yole@jetbrains.com, and I'll add the interested
people as contributors to the project.

As for the status, it hasn't really changed much recently - the current functionality
of the plugin is roughly the same as JavaScript in IDEA 5.0, without the
formatter. The formatter implementation is running into issues with the IDEA
formatter core, and I'll try once more to get these issues resolved before
the final 5.1 release. Some of the issues were fixed in recent 5.1 builds,
but I keep finding others. :)

CM> Any chance of a progress update on your Python plugin? Even
CM> releasing a build that was only alpha quality would be appreciated.
CM>
>> Hello Gordon,
>>
GT>>> Where is this Python language plugin which you mention in your
GT>>> article? A quick survey of the Plugin Manager and a Google search
GT>>> leave me unenlightened...
GT>>>
>> Still nowhere but my personal Subversion repository... now that the
>> article draft is done, I'll focus on the remaining few issues that
>> need fixing before I can release the plugin.
>>
--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

Many thanks for the update Dmitry. I didn't realise you had it in the java.net
incubator now. That's great news, since the incubator isn't just restricted
to project members, anyone can access it! For those who are interested, the
project name is "pythonid" and you can access the project here: https://pythonid.dev.java.net

I haven't tried it yet but will hopefully find the time to have a play tonight.
Given my current schedule I'm not sure what my chances are of helping out
with the project, but I'll definitely let you know if I do find some spare
time.

Thanks again,
Chris

Hello Chris,

Keith Lea now also participates in the work on the plugin, and we have
created a java.net project for it. However, the project is still in
the incubator, and as far as I understand, it means that it's not
publically accessible and only the project members have access to its
content.

If anyone is interested in contributing to the plugin, you can send me
your java.net account IDs to me at yole@jetbrains.com, and I'll add
the interested people as contributors to the project.

As for the status, it hasn't really changed much recently - the
current functionality of the plugin is roughly the same as JavaScript
in IDEA 5.0, without the formatter. The formatter implementation is
running into issues with the IDEA formatter core, and I'll try once
more to get these issues resolved before the final 5.1 release. Some
of the issues were fixed in recent 5.1 builds, but I keep finding
others. :)



0

Hello Chris,

CM> Many thanks for the update Dmitry. I didn't realise you had it in
CM> the java.net incubator now. That's great news, since the incubator
CM> isn't just restricted to project members, anyone can access it! For
CM> those who are interested, the project name is "pythonid" and you can
CM> access the project here: https://pythonid.dev.java.net

Ah, indeed - there must have been some delay in updating the permissions.
I know I tried to access the project as soon as I got the incubator approval
request, and it requested my login for that. Now I can access it without
logging in, too.

--
Dmitry Jemerov
Software Developer
JetBrains, Inc.
http://www.jetbrains.com
"Develop with pleasure!"


0

For anyone who's interested, here's a quick "how-to" for building and installing
the Python plugin:

1) check the pythonid project out of java.net. eg

cvs -d :pserver:<your-java.net-username>@cvs.dev.java.net:/cvs login
cvs -d :pserver:<your-java.net-username>@cvs.dev.java.net:/cvs checkout pythonid


2) Open the IDEA project file that comes with pythonid.
3) Make sure the JDK is set up correctly. You need to have the project pointing
at an "Intellij IDEA SDK" rather than a normal JDK. If you don't have one
of these set up already, create one using the "Configure JDK" dialog by clicking
the SECOND icon in from the top left.
4) Make sure idea.jar is added to the classpath of the JDK you just created.
Note that it MUST be added to the JDK classpath rather than as a module library.
5) Make sure the "Python Plugin" module depends on both the other two modules
(the project in CVS only depends on one I think, that will cause problems
when you deploy).
6) Build the project. This shouldn't generate any errors (although I do get
30 warnings). If you get any errors, double-check steps 3 & 4 carefully.
7) Right-click on the "Python Plugin" module in the project view. Choose
"Prepare Plugin Module for Deployment".
8) Exit IDEA.
9) Drop the jar file that was created by step 7 into your config/plugins
directory.
10) Start IDEA. The plugin should now be showing up in your installed plugins
list and your python files should now have a funky python icon!

Have fun!


0

Hi,

Thanks Chris - excellent instructions. I've managed to set it up in no time. :)

Although I can only get code completion to work for symbols defined in my test.py file. I am assuming this is not implemented yet.

Will there be completion on the standard python modules in future ?

Cheers,
Oliver

0

Please sign in to leave a comment.