eclipse / tm4e

TextMate support in Eclipse IDE
https://projects.eclipse.org/projects/technology.tm4e
Eclipse Public License 2.0
87 stars 56 forks source link

Strange (markdown?) content type set for unrelated text files #703

Closed iloveeclipse closed 6 months ago

iloveeclipse commented 6 months ago

I've played with latest tm4e snapshot from today from https://download.eclipse.org/tm4e/snapshots/ and see some strange issue probably related to wrong content type detected by tm4e.

HebrewSample.txt

data.txt

test.txt

test.txt is even empty file.

The files attached above are just random text files I had in my workspace that are supposed to be "plain text" files without any syntax etc, but they seem to be recognized as markdown? content type and show an ugly black icon.

Here how it looks like:

image

Two issues here: 1) Ugly black icon probably wasn't meant to be ugly, but just has wrong background set (should be transparent, isn't). 2) The content type detection seem to go mad. I would expect none of the files above should be linked to the markdown? content type.

sebthom commented 6 months ago

This looks like a bug in Eclipse Platform to me.

There is this content type registration without any file extensions/file patterns https://github.com/eclipse/tm4e/blob/d5aa3918fb716a8239ae1226180372d84f1b9ae6/org.eclipse.tm4e.language_pack/plugin.xml#L833

which also provides an icon https://github.com/eclipse/tm4e/blob/d5aa3918fb716a8239ae1226180372d84f1b9ae6/org.eclipse.tm4e.language_pack/plugin.xml#L842

and somehow Eclipse associates it with all text files in your case.

iloveeclipse commented 6 months ago

Note following: I've set generic editor as default for text content type, and there is code in generic editor that is used by platform to check if it can be used for given files - if it "agrees" it may provide content type platform should use (if I remember it correct). So here I assume it goes to tm4e and that one says markdown. To reproduce, take latest SDK nightly and set generic editor as default as shown in the screenshot.

sebthom commented 6 months ago

there is code in generic editor that is used by platform to check if it can be used for given files - if it "agrees" it may provide content type platform should use

can you point me to that code?

iloveeclipse commented 6 months ago

I think this is org.eclipse.ui.internal.genericeditor.GenericEditorWithIconAssociationOverride.getEditorDescriptorForFile(IEditorDescriptor, String) and org.eclipse.ui.internal.genericeditor.GenericEditorWithContentTypeIcon.getImageDescriptor()

sebthom commented 6 months ago

Also, is it just the icon that gets changed or is the *.txt file actually markdown syntax highlighted?

iloveeclipse commented 6 months ago

In the data.txt you see the numbers seem to be colored, so it looks like syntax highlighting is applied too.

iloveeclipse commented 6 months ago

I think it is the return value of org.eclipse.ui.internal.genericeditor.GenericEditorWithIconAssociationOverride.overrideDefaultEditor(String, IContentType, IEditorDescriptor) that makes the difference now, the question why is the content type assumed to be markdown?

iloveeclipse commented 6 months ago

One data point more: this seem to be visible in (not released) tm4e snapshot only, as using TextMate 0.9.0.202401090933 doesn't show the "black markdown" icons while properly indicating that the text files will be opened with generic editor. However, I see that when the files are opened in editor, some syntax highlighting happen.

sebthom commented 6 months ago

Do you only have this issue with Eclipse SDK nightly? I don't seem to be able to reproduce it with the currently used target sdk.

iloveeclipse commented 6 months ago

Sorry, my fault, I forgot to mention, the only way to see it is with the new feature implemented in the 4.31 SDK, see https://github.com/eclipse-platform/eclipse.platform.ui/issues/1659 implemented (see https://eclipse.dev/eclipse/news/4.31/platform.php#default_editor_preference).

So in the Content Types, I've manually set generic text editor as default for "Text" content type (before it was "Plain Text Editor"):

image

sebthom commented 6 months ago

I changed my target file to:

        <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
            <repository location="https://download.eclipse.org/releases/2024-03/"/>
            <unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/>
            <unit id="org.eclipse.sdk.ide" version="0.0.0"/>
        </location>

which gives me: image

But I don't see that "Default" button: image

How can I get the right platform binaries into my target file?

iloveeclipse commented 6 months ago

I assume you should use https://download.eclipse.org/eclipse/updates/4.31-I-builds repo as there is no final release yet.

iloveeclipse commented 6 months ago

Or just grab latest SDK build from https://download.eclipse.org/eclipse/downloads/drops4/I20240213-1800 and install tm4e snapshot build on top (which is what I did).

sebthom commented 6 months ago

Ok, I could reproduce it. As I suspected, the issue is in the Eclipse Platform. When querying content types for a file, eventually ContentTypeCatalog#selectMatchingByName will be invoked.

When this method is called with the file extension "txt" it will return the directly mapped contenttype org.eclipse.core.runtime.text and all child content types that have no "builtInAssociations", e.g. have no file-extensions, file-patterns, file-names defined. So it will return these additional content types if the language pack is installed:

I don't think this behavior is correct.

iloveeclipse commented 6 months ago

I will check that tomorrow, but why is this problem visible with the snapshot tm4e build but not with released version?

sebthom commented 6 months ago

why is this problem visible with the snapshot tm4e build but not with released version?

I don't know.

But it gets more funky. Depending on how a content type is registered, it will be automatically associated with *.txt or not by the Eclipse platform.

<extension point="org.eclipse.core.contenttype.contentTypes">
    <!-- this content type will NOT be reported by 
         Platform.getContentTypeManager().findContentTypesFor("txt") -->
    <content-type
       id="contenttype.green"
       base-type="org.eclipse.core.runtime.text"
       name="Green" 
       file-extensions="green" />

    <!-- this content type will be reported by
         Platform.getContentTypeManager().findContentTypesFor("txt") -->
    <content-type
       id="contenttype.blue"
       base-type="org.eclipse.core.runtime.text"
       name="Blue" />
    <file-association
       content-type="contenttype.blue"
       file-extensions="blue" />
</extension>
sebthom commented 6 months ago

I merged PR #706 with a temporary workaround. But I don't think this can be the solution. The issue with wrongly associated content types also applies to other plugins. E.g. when you have wildwebdeveloper installed ContentTypeManager will report org.eclipse.wildwebdeveloper.parent as content type of *.txt files.

iloveeclipse commented 6 months ago

Thanks for quick workaround. Unfortunately, 4.31 M3 build is almost over, and I have no tested fix yet, but I've created https://github.com/eclipse-platform/eclipse.platform/issues/1207 to follow up.

sebthom commented 6 months ago

I'm going t close this issue for now as there isn't much more we can do in tm4e.